用swift开发framework时采用OC混编的解决方案
随着swift ABI的稳定,越来越多的开发者开始使用swift语言开发项目,但是由于大部分工具库也还是使用OC写的,因此我们不得不需要在项目中采用swift与oc混编。
在开发app项目时,swift与oc混编其实很容易,xcode会自动为我们建立一个桥接文件,这样我们就很容易的在swift中调用oc的方法或类对象。
但是在开发framework的时候,xcode不会为我们建立这个桥接文件,因此我们在framework中也就不能采用桥接的方式进行混编了。
framework中实现混编的方式有两种:
第一种:也是最简单的一种,就是将oc的头文件暴露出来,并在framework的头文件中导入。(缺点:我们不想对外暴露的类或方法,不得不暴露出去)
这样一来,我们就可以在swift中直接引用oc的类了
第二种:配置modulemap,这个方法可以避免我们不得不对外暴露我们的oc类。
(1):在项目中创建module.modulemap文件,具体内容如下:
module MyObjcFramework { header "oc/MyObjc.h" // 这里的路径是相对于module.modulemap的所在目录 export * }
这里我们定义了一个MyObjcFramework的模块,也就是提供给swift导入的模块名称。
header是该模块的头文件,如果你需要了解关于module的更多详细信息,可以查看这篇文章,或者Clang Module's documentation。
(2):配置Swift Compiler - Search Paths Import Paths:
这里是为了告诉编译器,我们自定义的module所在路径,这里指定了项目的根目录:$(SRCROOT),当然你也可以指定的更具体,像下面这样:
然后我们就可以在swift中导入我们自定义的module,从而引用oc类。
import Foundation import MyObjcFramework // 导入自定义模块 public func testPrint(_ str: String) { let objc = MyObjc() objc.printStr(str) }
以上两种方法解决了我们在使用swift开发framework时与oc混编的问题,一般常用第二种方式,不过依具体情况决定。