排雷記錄:Swift +Objective-C混合Framework的一些問題
現在問題場景是很多原有Framework,都是基於OC的,其中Framework積累大量企業實踐程式碼,N多專案複用,歷經考驗,如果全部改寫為Swift,不現實;不過部分類已經Swift化了,考慮到複用和學習的原則,決定Framework為OC+Swift混合程式碼方式,App工程引用這個混合程式碼的Framework。
環境:
Swift App工程 + Swift Framework(混合大量OC檔案+少量Swift檔案)
XCode 7.1
OS X 10.11.1
問題1:
在Swift Framework中,因為OC和Swift都有,而且部分Swift類會呼叫OC的類,有些Swift類會繼承OC的類,所以,想當然的在Swift Framework中手動加入了橋接標頭檔案,如Xxx-Bridging.h,Build Settings中指定了橋接標頭檔案路徑,然後編譯,結果報錯:
<unknown>:0: error: using bridging headers with framework targets is unsupported
很顯然說是在framework內不支援橋接標頭檔案,那該怎麼辦呢?
答案是:1、刪除橋接標頭檔案,如Xxx-Bridging.h,刪到垃圾桶亦可;也把Build Settings中指定了橋接標頭檔案路徑配置清空。
2、和寫一個OC的Framework的步驟一樣(假如這個Swift Framework叫TestLib):
(1)在umbrella header中寫上這個OC檔案的引用,如:#import <TestLib/TestOC1.h>
(2)在專案的Build Phases,Headers中吧OC標頭檔案放到Public中。
3、Swift Framework中的Swift類就能直接訪問OC類了,不用再寫import了。
問題2:Swift App工程引入了混合OC+Swift的Swift Framework,並使用了其中的Swift類,但在編譯App工程時,卻報錯:
'XXXX' is unavailable: cannot find Swift declaration for this class
奇怪了,Swift程式碼呼叫Swift Framework中的Swift類,居然找不到申明。
分析了下自己的Framework,有個過程是自己寫的指令碼自動生成Framework的,並用lipo命令合併了模擬器和真機的Framework。
然後,不用合併的Framework而改用單獨的Framework,結果,Swift App工程就編譯通過了。
(回頭分析下why,先把問題解決方法記錄下)