入職新公司後,接手了一個Swift項目。項目質量已經吐槽過一次就略過了,感興趣的能夠看我以前的博客。固然我以前對Swift只是略有了解,略到只看過沒寫過的程度,主要語言仍是OC。不過嘛其實語言都是相通的,況且方法都是相同的只不過語法上可能有點兒小差錯。不過仍然有些東西會莫名其妙被卡住。框架
好比建立一個UIButton,OC中咱們通常使用 [UIButton buttonWithType:UIButtonType] 這個構造方法來快速初始化並賦予UIButton的type屬性,固然也有一個緣由是UIButton的type是read-only屬性,咱們只能在初始化方法中去設置它。那麼Swift中怎麼寫呢?ui
答案是 UIButton.init(type: UIButtonType) 。有沒有感受常見的方法參數變的很彆扭?不過慢慢的就習慣啦。其他的好比「中括號+空格」的調方法語法改成所有「.」出來,語句結束若換行則不用加";"等等等等吧。不過本篇並非Swift與OC的開發過程當中的語法比較,而是二者怎麼橋接,因此切回正題啦。spa
1.Swift中調用OC的類與方法blog
在正式開始接手項目以後,須要添加UITableView的下拉刷新、上拉加載和等待窗口HUD的功能。幾乎全部的項目中都涉及到這樣的功能,對咱們來講實在是太簡單了。使用系統控件UIRefreshControl本身手寫當然麻煩,但咱們有極其方便李明傑的MJRefresh三方框架來一句話添加下拉刷新與上拉加載(非廣告,我也不是跟李明傑學的,不過這個刷新控件確實不錯,節省時間)。至於HUD,咱們同樣扔掉了UIProgressView控件來使用MBProgressHUD三方框架添加等待HUD。這簡直沒有難度嘛。教程
等一下,好像少了點兒什麼。開發
咱們是用Swift開發的工程啊,而上述兩個三方框架與許許多多成熟的三方框架,幾乎都是使用的Objective-C封裝的。支持Swift這種不斷更新的語言的三方框架不多。get
擺在面前兩條路,本身使用系統控件封裝,或者研究下Swift類中怎麼調用Objective-C的類。編譯器
嘗試了下使用UIRefreshControl來封裝下拉加載。作確實是作出來了,不過 1.樣子很醜;2.刷新不敏感;3.須要等待HUD還須要本身封裝。雖然能夠實現可是對於強迫症來講,習慣了MJRefresh的快捷高效再來使用這個,簡直難受的不要不要的。博客
終於到主題了,橋接。it
咱們知道Swift中自定義的類不須要導入頭文件,編譯器會自動幫咱們導入。那麼Objective-C怎麼作呢?
跟着網上教程,當咱們建立以Swift爲語言的工程後,在第一次建立或拖入OC語言的文件時會自動彈出一個對話框,以下:
該提示的意思是,是否建立一個Objective-C bridging header,也就是建立一個Swift中能調到OC的橋文件。咱們點擊回車,會自動建立一個名叫 你的項目名(默認)-Bridging-Header.h 的頭文件。這文件是幹什麼用的呢?
咱們點開這個文件,裏面只有這樣一行註釋:
以我不怎麼樣的英語造詣,直譯以下:
使用這個文件來導入你想導入到Swift中的(OC)目標頭文件.h。
簡單明瞭。接下來怎麼作?
直接在這個文件中導入頭文件,以後你能夠在Swift語言中直接使用,就像Swift類同樣。
導入頭文件:
Swift中調用:
大功告成。
另外有一點,若你導入頭文件後仍然無效,那麼除了編譯下看看效果以外,還能夠設置下項目的Target - - Build Settings--Swift Compiler--Objective-C Bridging Header內容爲你的項目名字(默認)/Bridging-Header.h,這個與Bridging-Header.h位置有關,從項目的根目錄開始在Objective-C Bridging Header選項裏面寫入Bridging-Header.h相對路徑。
2.Objective-C中調用Swift
在上述問題成功解決後,老闆給了另一個任務,讓我把外包公司作的另一個完整的功能整合到我現有的App中。看了下界面不是特別難,但拿到代碼就傻眼了,又變成OC了。
在向老闆抗議無果後,硬着頭皮添加。在經歷了缺乏各類文件的error後,功能文件通過一個上午被我整合在了一塊兒。但最大的問題出現了,如何在OC中調用Swift文件?
首先,咱們須要到Target - - Build Settings--Packging--Defines Module,將值改成YES。
而後,咱們到所想要調用Swift類的OC類中,調用這樣一個頭文件:
#import <你的項目名-Swift.h>
若你沒有修改,通常都是你的項目名。你可能會想,我並無建立這樣一個頭文件。可是要仔細看,它使用的是尖括號<>,這說明它是系統類,你是看不到的。
完成,盡情使用任何你想用的Swift類吧~