OC調(diào)用Swift4.0的各種坑

簡(jiǎn)述:最近幾年蘋(píng)果主推swift,OC已經(jīng)很少更新了,處于維護(hù)狀態(tài)。所以慢慢多了很多OC混編Swift的項(xiàng)目,但是其實(shí)swift調(diào)用OC還是挺簡(jiǎn)單的,把OC項(xiàng)目慢慢轉(zhuǎn)成swift問(wèn)題不大。swift可以算是OC更上層的語(yǔ)言,我這里說(shuō)的坑都是關(guān)于Swift轉(zhuǎn)OC的,很奇葩吧,還有把Swift項(xiàng)目轉(zhuǎn)成OC的,一句話公司需求,懟得程序員無(wú)言以對(duì)。(廢話不多說(shuō)了,后面全是罵項(xiàng)目經(jīng)理和產(chǎn)品的。。。省略一萬(wàn)字)

OC和Swift混編的基礎(chǔ)設(shè)置就不說(shuō)了,可以看我之前的一個(gè)文章
http://www.itdecent.cn/p/69ba19692bae

一. OC調(diào)用Swift中的Class類這里

1.這個(gè)類必須是繼承NSObjec或者NSObjec的子類

2.Class前面要加@objcMembers (這個(gè)關(guān)鍵字是讓該類所有屬性和方法加上@objc),3.0之前是蘋(píng)果自動(dòng)幫你加上的,據(jù)說(shuō)嫌棄打包會(huì)偏大一些,后面改成玩家自己加。
例如:@objcMembers class CustomServiceTool: NSObject {}

3.類中的協(xié)議、枚舉、結(jié)構(gòu)體這些東西的調(diào)用
① 協(xié)議:直接在前面加一個(gè)@objc
@objc protocol CustomServiceToolDelegate: NSObjectProtocol {}

②枚舉:試了一下,必須定義出Int類型,前面加@objc才能調(diào)用(畢竟swift的枚舉比OC強(qiáng)大太多)
@objc enum CPLineType: Int {
case schoolToHome = 0
case homeToSchool
case return
}

③結(jié)構(gòu)體:在oc中是不能調(diào)用struct里面的內(nèi)容的,你想在類似class前面加個(gè)@objc的方法加在struct前面是不行的,那但是我們又想在oc中調(diào)用struct的屬性,那怎么辦呢?我們只能夠再建一個(gè)類,在類里寫(xiě)個(gè)方法來(lái)返回struct中的值

坑點(diǎn):
1.每次在一個(gè)類前面加個(gè)@objcMembers的時(shí)候都需要重新編譯一遍才能打出提示(混編期間,報(bào)錯(cuò)請(qǐng)不要懷疑自己的代碼,大部分編譯一下就沒(méi)事了。。。)
2.有種特殊的情況,比如我一個(gè)OC控制器中調(diào)用了swift寫(xiě)的view,然后其他用swift寫(xiě)的控制器需要調(diào)用OC控制器,這時(shí)候要是只是把OC控制器寫(xiě)到橋接文件中是會(huì)報(bào)錯(cuò)的。(這種就是混編項(xiàng)目比較變態(tài)的情況)------------解決辦法:swift寫(xiě)的View用向前聲明( @class BannerView);
3.swift中的一些類型是OC沒(méi)有的,或者類型名字差不多但是類型完全不同
例如:
swift中的Int定義成可選類型的時(shí)候,這時(shí)候OC是調(diào)不了swift的Int類型,解決方式,定義普通Int型

最后編輯于
?著作權(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)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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