1. 程式人生 > >排雷記錄:Swift +Objective-C混合Framework的一些問題

排雷記錄:Swift +Objective-C混合Framework的一些問題

對於Swift的出現,估計很多公司很多人都面臨著原有開發框架的更新換代,Swift經過一年的發展,到現在2.1版,顯而易見的大坑填的差不多了,算是基本堪以大用了,這場景讓我恍惚回到使用.Net 2.0架構軟體系統的年代,都是剛算夠上堪以大用,可以引入企業級開發了,可以考慮構建穩固版本計劃和投入資源實施了。


現在問題場景是很多原有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,先把問題解決方法記錄下)