和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,那么你需要創建一個XwjModule.h文件夾用於包含需要引入的OC頭文件。
如果沒有同名頭文件,會導致無法調試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 和 {s.name}_SOURCE 用於動態的切換二進制化模式和代碼模式。具體方式如圖:
最后
對於OC與Swift混編的處理方式就分享到這里 還有其他疑問的同學可以在留言,我們可以一起討論。下篇打算分享下 Swift與OC交互之ModuleMap的作用