1. 程式人生 > 其它 >用swift開發framework時採用OC混編的解決方案

用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混編的問題,一般常用第二種方式,不過依具體情況決定。