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,那么你需要創建一個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的作用


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM