OC和Swift模块化混编方案
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
OC和Swift模块化混编⽅案
和Swift模块化混编⽅案
背景
⽬前的⼯程是纯OC的⼯程,并且已经使⽤了Cocoapods实现模块化管理。
为了与时俱进,现需要引⼊swift到⼯程,并且能够让cocoapods管理的Swift模块与OC模块相互调⽤。
混编⽅案
1.添加空的Swift⽂件到主⼯程,⽐如叫XXMain.swift
注意:主⼯程必须要有⼀个Swift⽂件,使得Xcode⽀持Swift编译。
创建的时候会弹出是否需要创建 Bridging-Header桥接⽂件,这⾥可以不⽤创建。
模块化做的⽐较好的情况下,主⼯程模块中添加Bridging-Header⽂件其实也⽤不上。
cocoapods⾃动管理modulemap⽤于暴露swift类以及引⼊其他OC类。
2.修改iOS最低⽀持的版本号为12.3
注意:swift5开始 ABI才稳定,⽽从iOS 12.3开始系统内包含swift5。
创建的时候会弹出是否需要创建 bridge桥接⽂件,这⾥不需要创建。
创建bridge⽂件之后,可能会导致cocoapods模块下的swift⽂件报找不到OC类的错误。
cocoapods⾃动管理modulemap⽤于需要暴露的swift类以及引⼊其他OC类。
3.引⼊OC到Swift模块
注意:我的Swift代码会根据业务分成不同的模块,通过cocoapods去管理。
此时需要在模块中添加⼀个h头⽂件⽤于引⼊OC类,⽂件头的名称要与模块 “名称⼀致” ,⽐如pods模块名称为XwjModule,那么如果没有同名头⽂件,会导致⽆法调试Swift模块代码
4.Podfile和PodSpec
注意:
Podfile中需要使⽤use_modular_headers!⽅式兼容OC与Swift混编
PodSpec⽂件中source_files中除了包含swift⽂件,还要包含第3步中创建的头⽂件。
Podfile⽂件
PodSpec⽂件
⼆进制化Swift模块
注意:上述四个步骤已经可以完成OC与Swift的混合开发了,如果此刻不想把Swift源码暴露出来,那么就需要将Swift模块⼆进制化。
1.合并静态库
通过上述混编⽅案,我们已经可以进⾏正常开发,此时,我们分别在"Debug 模拟器模式" / "release 真机模式"执⾏build,
可以得到Xcode编译的所有的a静态库⽂件。
找到其中Swift模块对应的静态库,并且执⾏lipo -create命令合并静态库。
2.头⽂件
找到静态库依赖的头⽂件,以SwiftJSSDKModule为例⼦,Xcode编译之后会⽣成libSwiftJSSDKModule.a静态库,
同时还会⽣成SwiftJSSDKModule-Swift.h 和 SwiftJSSDKModule-umbrella.h⽂件。
SwiftJSSDKModule-Swift.h实际上是Xcode把Swift代码翻译成了OC代码,使得其他的OC代码可以引⽤其对象
SwiftJSSDKModule-umbrella.h 实际上是包含了Swift模块⾃⼰需要引⼊的OC头⽂件
3.⼆进制化的PodSpec
⼆进制化后,我们只需要包含a静态库、SwiftJSSDKModule-Swift.h 和 SwiftJSSDKModule-umbrella.h即可完成模块配置了。
这⾥分享⼀个⼩技巧,使⽤⼀个宏IS_BINARY 和 {}_SOURCE ⽤于动态的切换⼆进制化模式和代码模式。
具体⽅式如图:
最后
对于OC与Swift混编的处理⽅式就分享到这⾥还有其他疑问的同学可以在留⾔,我们可以⼀起讨论。
下篇打算分享下 Swift与OC交互之ModuleMap的作⽤。