簡(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的省咨,一句話(huà)公司需求肃弟,懟得程序員無(wú)言以對(duì)。(廢話(huà)不多說(shuō)了零蓉,后面全是罵項(xiàng)目經(jīng)理和產(chǎn)品的笤受。。敌蜂。省略一萬(wàn)字)
OC和Swift混編的基礎(chǔ)設(shè)置就不說(shuō)了箩兽,可以看我之前的一個(gè)文章
http://www.reibang.com/p/69ba19692bae
一. OC調(diào)用Swift中的Class類(lèi)這里
1.這個(gè)類(lèi)必須是繼承NSObjec或者NSObjec的子類(lèi)
2.Class前面要加@objcMembers (這個(gè)關(guān)鍵字是讓該類(lèi)所有屬性和方法加上@objc),3.0之前是蘋(píng)果自動(dòng)幫你加上的章喉,據(jù)說(shuō)嫌棄打包會(huì)偏大一些汗贫,后面改成玩家自己加。
例如:@objcMembers class CustomServiceTool: NSObject {}
3.類(lèi)中的協(xié)議秸脱、枚舉落包、結(jié)構(gòu)體這些東西的調(diào)用
① 協(xié)議:直接在前面加一個(gè)@objc
@objc protocol CustomServiceToolDelegate: NSObjectProtocol {}
②枚舉:試了一下,必須定義出Int類(lèi)型摊唇,前面加@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)容的咐蝇,你想在類(lèi)似class前面加個(gè)@objc的方法加在struct前面是不行的,那但是我們又想在oc中調(diào)用struct的屬性遏片,那怎么辦呢嘹害?我們只能夠再建一個(gè)類(lèi)撮竿,在類(lèi)里寫(xiě)個(gè)方法來(lái)返回struct中的值
坑點(diǎn):
1.每次在一個(gè)類(lèi)前面加個(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中的一些類(lèi)型是OC沒(méi)有的,或者類(lèi)型名字差不多但是類(lèi)型完全不同
例如:
swift中的Int定義成可選類(lèi)型的時(shí)候檀蹋,這時(shí)候OC是調(diào)不了swift的Int類(lèi)型松申,解決方式,定義普通Int型