OC項目中使用swift混編

1.背景

? 外包項目(OC)交接完畢,需要把另一個swift的項目的部分(很多)頁面加入到這個外包項目中。有兩種解決方案

一、將swift的代碼變成OC的代碼,即照著swift的代碼寫成OC的代碼(呵呵了,寫了兩星期,放棄主要是沒服務器接口也沒法調試,總不能開著青花瓷模擬數(shù)據(jù)吧,自己也懶得寫模擬數(shù)據(jù),天知道OC要寫多少個@,)

二、OC與Swift混編(可能會有坑,但是比較簡單,一勞永逸),那就接下來踩坑吧!

2.OC與swift混編坑

1.引入 文件名-Bridging-Header.h 橋接文件

? ? ? ?創(chuàng)建swift文件的時候會有提示,也可以自己創(chuàng)建,具體可參照iOS開發(fā)之OC與Swift混編,這一步?jīng)]有什么問題。

2.import 問題

原來的開始引入swift項目中的文件,發(fā)現(xiàn)#import <MagicalRecord/MagicalRecord.h> 等引入的頭文件報錯,百度之后了解需要改成#import "MagicalRecord/MagicalRecord.h" ,不能使用<>的形式,搜索代碼將<>的形式改成“”,系統(tǒng)的不用改,cocopods的里面的也不用改。

3.cocopods引用swift三方庫

swfit項目中有用到了一些三方庫,

如Snapkit,如果直接在podfile里面寫的話會有問題,這時候需要了解useFrameworks,不繞彎子,直接貼答案Podfile中的 use_frameworks!

直接給結論:

純swift項目中使用cocopods ,PodFile必須使用?use_frameworks!

純oc項目中默認使用 #use_frameworks!

swift+oc中使用? #use_frameworks!?

oc+swift項目中,老老實實的把三方庫文件拽到項目里來吧。如下:

4.項目某個.h文件報錯

?貌似是引入swift項目之后編譯比較嚴格了,我的報錯文件里提示我少屬性或者方法,但是我查到那個文件是是不缺少的,這就尷尬了,我相信xcode是不會騙我的,我的眼睛也不會騙我的,那么真相只有一個,在這個項目下有可能有兩個相同的名稱的文件,這兩個文件由于刪除的時候只是移除了依賴,并沒有刪除掉,在沒有引入swift之前編譯不嚴格,所以沒有問題,引入swift之后,編譯嚴格了所以把它引入了。

打開Finder在項目下搜索報錯的文件名,果然有數(shù)個一樣的,刪掉錯誤的之后,果然就好了,當然有好幾個相同的文件,統(tǒng)統(tǒng)刪掉,編譯,succeed!nice!

總結:混編之前代碼先備份!備份!備份!



use_frameworks!原文:

A、用cocoapods 導入swift 框架 到 swift項目和OC項目都必須要 use_frameworks!

B、使用 dynamic frameworks,必須要在Podfile文件中添加 use_frameworks!

(1)如果在Podfile文件里不使用use_frameworks! 則是會生成相應的.a文件(靜態(tài)鏈接庫),通過staticlibraries這個方式來管理pod的代碼。? (2)Linked:libPods-xxx.a包含了其它用pod導入的第三方框架的.a文件。(3)如果使用了use_frameworks! 則cocoapods會生成相應的.frameworks文件(動態(tài)鏈接庫:實際內(nèi)容為Header+ 動態(tài)鏈接庫 + 資源文件),使用dynamicframeworks來取代staticlibraries方式。? (4)Linked:Pods_xxx.framework包含了其它用pod導入的第三方框架的.framework文件。

use_frameworks! -> dynamic frameworks 方式 -> .framework

#use_frameworks! -> static libraries 方式 -> .a

關于Library 和 Framework 可以參考:

http://blog.lanvige.com/2015/...

(1)swift項目cocoapods 默認 use_frameworks!(2)OC項目cocoapods 默認 #use_frameworks!

用cocoapods導入OC框架到swift項目:

(1)#use_frameworks! 必須創(chuàng)建頭文件,在頭文件里面 #import "AFNetworking.h"

(2)use_frameworks! 如果有頭文件,在頭文件里面 #import "AFNetworking/AFNetworking.h",其它swift文件中用到不需要再import;如果沒有頭文件,則在每個需要用到的swift文件里 import AFNetworking。

用cocoapods導入swift框架到swift項目:

(1)必須use_frameworks!

(2)不需要頭文件,在需要用到框架的swift文件里 import Alamofire

用cocoapods導入OC框架到OC項目:

(1)#use_frameworks! 在需要用到的文件里 #import "AFNetworking.h";也可以通過pch文件,用法類似swift中的頭文件。

(2)use_frameworks! 與(1)類似,用法上沒有區(qū)別。

用cocoapods導入swift框架到OC項目:不考慮

總結:

(1)用swift項目考慮到會使用 OC 和 swift 兩種第三方框架,所以Podfile中使用swift項目默認的 use_frameworks! 更為妥當,并且frameworks動態(tài)鏈接庫具有一定的優(yōu)勢。

(2)可以建立一個Bridge頭文件,用來import那些OC框架的.h文件:#import "xxx/xxx.h"。或者不建頭文件,像swift框架一樣,直接在需要用到的swift文件中import。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內(nèi)容