本文主要參考了優雅地開發Swift和Object C混編的Framework。不過實際發現,完全按照文章裏面”優雅的解決方案“裏面的說法操作,還是沒法成功。我這裏根據實際情況作出了調整。
- 參考的文章中在“優雅的解決方案”這個section之前的內容都是好用的,你可以用用來創建一個兼容OC和Swift的Cooca Touch Framework。
- 這裏說的“優雅”,指的是控制OC部分接口保留的問題(詳情可以參考原文部分)
原文裏面只說了具體的操作步驟,沒有高屋建瓴地說出這種方法的實際思路:事實上,採用module.modulemap
的方法是將OC部分打包成一個可以使用Swfit語句進行導入(import)的模塊。以這個視角,我們再來梳理一下操作步驟:
新建一個module.modulemap
文件
文件裏的內容如下:
module OCSource [system] {
//由於module.modulemap和OCSource.h是在同一個文件夾的,如果不是同一個,路徑要寫全
header "OCSource.h"
export *
}
有一個容易犯錯的問題是將這裏的模塊名字, OCSource命名爲了Cocoa Touch Framework的名字。這樣會導致編譯出錯,錯誤信息會提示你Module名字重複定義。這裏的名字要區別的Framework的名字,具體是什麼可以自己自由選擇。不過推薦和頭文件的名字一致
後一步操作是把module.modulemap
的路徑添加到Build Settings的Import Paths
中,這是爲了讓我們在Swift裏面import
這個module的時候能夠找到目標.
那麼,這裏的$(SRCROOT)/MixFramework
其實就是指的module.modulemap
的路徑。
將OCSouce.h
文件的權限改爲project
這可以讓OCSource.h
不再對外可見。
然後,刪除MixFramework.h(umbrella header)中#import 的OC header。
原文的內容到此結束,但是其實還是不夠的。這時候如果編譯,會發現你在Framework內部的Swift使用OCSource的地方都會報錯說OCSource不存在。因爲將OCSource.h
從umbrella header中刪除之後Swift就無法看到這個文件了。然而,通過module.modulemap
文件我們將OCSource.h
及相關的OC文件打包成了了一個Swift模塊,因此我們可以在Swift代碼中import進來:
import OCSource
在報錯的Swift文件中添加這個導入,就可以解決這個問題了.