天天看点

如何在Swift Package (SPM) 里使用ObjC/OC 代码

背景

最近在开发一个基于Swift的app。对于有些已经在OC实现或者只能在OC实现的功能,我们尽量想复用OC代码。这篇文章目的在解决如何在用Swift Package里调用OC代码。

Swift Package 有一些默认的路径。例如include/ Sources/ 等。以下的例子是objc 和 swift 代码在同一个Swift Package里 (如果是分开两个swift package 也是类似的操作)

// Package.Swift 
targets: [
	.target(
	name: "objc",
	dependencies: []
	),
   .target(
   name: "<Your_Swift_Target>",
   dependencies: ["objc"]
   ),
           

首先是Package.swift, 里面定义了两个target。一个是objc 一个是swift。swift target 需要依赖objc target。objc target的名字可以是自定义的,但是要跟一下的文件夹名字保持一致。

# 文件结构
- Package.swift
- Sources
  - <Your_Swift_Target>
  - objc
    - include
      - header.h
    - impl.m
           

以上是文件结构。根目录下Package.swift, 同目录下有Sources 文件夹,里面有所有的源代码。第一个子目录是Swift相关的文件夹;另外一个是objc,里面包括了所有的oc 的源代码。注意,objc下还要有一个include的目录,里面放所有exposed 头文件。这一步是关键。

// Your Swift file
import objc // 导入objc的头文件
           

最后在swift文件里引用objc 就可以使用objc下所有的头文件里的内容。

亲测有效。通过这个方式就可以在swift app里穿插一些oc的代码,方便复用。另外,除了引用oc library外,还可以支持oc_executable 和 swift_executable。详细请参考附带的链接。

参考

http://ankit.im/swift/2016/05/21/creating-objc-cpp-packages-with-swift-package-manager/