OC項(xiàng)目中使用swift混編

1.背景

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

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

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

2.OC與swift混編坑

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

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

2.import 問題

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

3.cocopods引用swift三方庫(kù)

swfit項(xiàng)目中有用到了一些三方庫(kù),

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

直接給結(jié)論:

純swift項(xiàng)目中使用cocopods ,PodFile必須使用?use_frameworks!

純oc項(xiàng)目中默認(rèn)使用 #use_frameworks!

swift+oc中使用? #use_frameworks!?

oc+swift項(xiàng)目中,老老實(shí)實(shí)的把三方庫(kù)文件拽到項(xiàng)目里來(lái)吧。如下:

4.項(xiàng)目某個(gè).h文件報(bào)錯(cuò)

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

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

總結(jié):混編之前代碼先備份!備份!備份!



use_frameworks!原文:

A、用cocoapods 導(dǎo)入swift 框架 到 swift項(xiàng)目和OC項(xiàng)目都必須要 use_frameworks!

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

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

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

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

關(guān)于Library 和 Framework 可以參考:

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

(1)swift項(xiàng)目cocoapods 默認(rèn) use_frameworks!(2)OC項(xiàng)目cocoapods 默認(rèn) #use_frameworks!

用cocoapods導(dǎo)入OC框架到swift項(xiàng)目:

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

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

用cocoapods導(dǎo)入swift框架到swift項(xiàng)目:

(1)必須use_frameworks!

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

用cocoapods導(dǎo)入OC框架到OC項(xiàng)目:

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

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

用cocoapods導(dǎo)入swift框架到OC項(xiàng)目:不考慮

總結(jié):

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

(2)可以建立一個(gè)Bridge頭文件,用來(lái)import那些OC框架的.h文件:#import "xxx/xxx.h"?;蛘卟唤^文件,像swift框架一樣,直接在需要用到的swift文件中import。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容