OC和Swift混編Frameowork優雅指南


本文主要參考了優雅地開發Swift和Object C混編的Framework。不過實際發現,完全按照文章裏面”優雅的解決方案“裏面的說法操作,還是沒法成功。我這裏根據實際情況作出了調整。

  1. 參考的文章中在“優雅的解決方案”這個section之前的內容都是好用的,你可以用用來創建一個兼容OC和Swift的Cooca Touch Framework。
  2. 這裏說的“優雅”,指的是控制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文件中添加這個導入,就可以解決這個問題了.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章