簡述:最近幾年蘋果主推swift,OC已經很少更新了,處于維護狀態。所以慢慢多了很多OC混編Swift的項目,但是其實swift調用OC還是挺簡單的,把OC項目慢慢轉成swift問題不大。swift可以算是OC更上層的語言,我這里說的坑都是關于Swift轉OC的,很奇葩吧,還有把Swift項目轉成OC的,一句話公司需求,懟得程序員無言以對。(廢話不多說了,后面全是罵項目經理和產品的。。。省略一萬字)
OC和Swift混編的基礎設置就不說了,可以看我之前的一個文章
http://www.lxweimin.com/p/69ba19692bae
一. OC調用Swift中的Class類這里
1.這個類必須是繼承NSObjec或者NSObjec的子類
2.Class前面要加@objcMembers (這個關鍵字是讓該類所有屬性和方法加上@objc),3.0之前是蘋果自動幫你加上的,據說嫌棄打包會偏大一些,后面改成玩家自己加。
例如:@objcMembers class CustomServiceTool: NSObject {}
3.類中的協議、枚舉、結構體這些東西的調用
① 協議:直接在前面加一個@objc
@objc protocol CustomServiceToolDelegate: NSObjectProtocol {}
②枚舉:試了一下,必須定義出Int類型,前面加@objc才能調用(畢竟swift的枚舉比OC強大太多)
@objc enum CPLineType: Int {
case schoolToHome = 0
case homeToSchool
case return
}
③結構體:在oc中是不能調用struct里面的內容的,你想在類似class前面加個@objc的方法加在struct前面是不行的,那但是我們又想在oc中調用struct的屬性,那怎么辦呢?我們只能夠再建一個類,在類里寫個方法來返回struct中的值
坑點:
1.每次在一個類前面加個@objcMembers的時候都需要重新編譯一遍才能打出提示(混編期間,報錯請不要懷疑自己的代碼,大部分編譯一下就沒事了。。。)
2.有種特殊的情況,比如我一個OC控制器中調用了swift寫的view,然后其他用swift寫的控制器需要調用OC控制器,這時候要是只是把OC控制器寫到橋接文件中是會報錯的。(這種就是混編項目比較變態的情況)------------解決辦法:swift寫的View用向前聲明( @class BannerView);
3.swift中的一些類型是OC沒有的,或者類型名字差不多但是類型完全不同
例如:
swift中的Int定義成可選類型的時候,這時候OC是調不了swift的Int類型,解決方式,定義普通Int型