背景
最近在开发一个基于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/