swift與OC混編(建立混編工程)
原創文章轉載請註明出處。
背景
Swift語言自推出以來蘋果官方就開始努力開始推這門新語言。就在15年WWDC上更是把Swift進行了開源,瞬間star就開始不斷飆升,截止今天(16年1月25)已經達到26059個star【原始碼請點選這裡】,而且每天還都在不斷增長,而且每天都會有Pull Requests。這足以說明全球開發者對這門語言的認可度。雖然現在在有些地方還不夠完善,但是相信會在未來的某一天,Swift語言會成為一門主流開發語言。
混合開發
扯淡結束,進入正題。
本文所使用的Xcode版本為7.1。
之前大家都熟悉了很久的OC語言,也許也開始嘗試寫一些Swift,但是這兩個語言怎麼進行混編呢?下面就說一下。Swift和OC的混編沒有做的C與OC那樣高度融合。
新建OC工程
新建工程不再多說,相信大家都很熟悉了,這裡我們先拿OC專案中引用Swift來進行說明。
新建工程名為MixDemo,新建完工程以後可以不用進行任何修改和配置。我們先新建一個Swift類,新建方式與之前一樣,只是在新建的時候注意選擇語言為Swift。
新建Swift類名為SwiftDemo。點Create以後會出現這樣一個彈出提示:
這是因為Swift和OC進行混編的時候需要一箇中間的橋接檔案。橋接檔案中需要匯入Swift類中引用到的OC類的標頭檔案。
點選Create Bridging Header,工程中會多出兩個檔案,一個是SwiftDemo.swift檔案和橋接檔案MixDemo-Bridging-Header.h。新建完以後工程結構如圖:
簡單的方法呼叫
OC呼叫Swift
新建完成Swift類以後,我們來Build一下工程,perfect模擬器跑的很歡快,雖然什麼程式碼也沒有寫。
下面我們在SwiftDemo.swift檔案裡寫點東西。程式碼如下:
@objc(SwiftDemo)
public class SwiftDemo : NSObject {
public func logMe() {
print("log me");
}
}
這裡注意一下:
在Swift類中最好加
@objc
進行說明。因為如果不是繼成自NSObject或NSObject的派生類,編譯後將不會生成對應的轉換類。在OC中也就找不到相應的宣告,從而導致無法呼叫。類和方法要宣告成public才能在OC中呼叫到。如果你已經看過Swift,相信你對這個應該不陌生。
當你在Swift裡新增一個public的類或者方法以後需要重新編譯才會在OC端呼叫到。因為Swift需要重新編譯轉化為OC的“中間檔案”,在“中間檔案”中有了該類或者改方法OC才可以呼叫。關於這個“中間檔案”下面會進行說明。
現在我們回到ViewController.m檔案裡。在OC檔案中如果想要呼叫Swift類的方法的話需要匯入一個頭檔案。該標頭檔案在工程中不可見,預設格式為xxx-Swift.h,其中xxx為專案名。對於我們這個專案來說,也就是MixDemo-Swift.h
import該標頭檔案以後我們就可以呼叫Swift的方法了。比如呼叫剛才我們寫的SwiftDemo裡面的logMe方法。上面提到修改Swift檔案如果是public的話需要重新編譯一下,好,那我們編譯一下。perfect,還是沒問題,繼續。
這時候你就可以寫你很熟悉的OC程式碼了。我們在viewDidLoad裡新增程式碼如下:
SwiftDemo* demo = [[SwiftDemo alloc] init];
[demo logMe];
這時候你就會發現,當你寫這段程式碼的時候,Xcode已經開始有提示了。是不是很神奇?
下面我們來看一下這個神祕的MixDemo-Swift.h檔案。按住command鍵然後點選滑鼠左鍵,進入該檔案。直接滑動到該檔案的最下面,你就會發現一件很有意思的事情:Xcode的提示並不是直接讀取的Swift,而是由於這個“中間檔案”。這個中間檔案裡有我們剛寫的SwiftDemo和logMe函式。
思考:如果把objc括號裡改成其他名稱是否可以?修改以後再回到這個檔案觀察有什麼變化。
然後Build一下,你會在控制檯上看到列印了”log me”,這說明OC呼叫了我們剛才寫的Swift的LogMe函式。
Swift呼叫OC
Swift呼叫OC的時候需要在MixDemo-Bridging-Header.h檔案中匯入Swift會引用到的CO類的標頭檔案。
首先我們在ViewController.h標頭檔案中宣告一個函式:
- (void) logYou;
然後在實現檔案中簡單些一下實現:
- (void)logYou {
NSLog(@"log you");
}
然後我們在MixDemo-Bridging-Header.h檔案中#import “ViewController.h”檔案,command+s儲存一下當前的編輯。
然後回到SwiftDemo.swift檔案中,在LogMe函式裡我們呼叫一下OC的logYou。
所以我們現在的邏輯是在OC的viewDidLoad中例項化SwiftDemo然後呼叫logMe,然後在SwiftDemo裡的logMe裡面例項化ViewController然後呼叫它的logYou。logMe程式碼如下:
public func logMe() {
print("log me");
let vc = ViewController()
vc.logYou()
}
然後再跑一下工程。兩句話都列印了,很好。
但是,這個MixDemo-Bridging-Header.h檔案到底是個什麼呢?
工程相關配置
點選工程target然後點選Build Settings,然後在搜尋框裡輸入swift,就會出現和Swift相關的配置資訊,如圖:
你會在Object-C Bridging Header項後面發現一個熟悉的檔案MixDemo-Bridging-Header.h。這個就是配置這個“中間檔案”的地方。所以,現在你知道了這個檔案配置的位置,以後你就可以自己任意修改成你喜歡的檔名字了,記得修改時檔案路徑問題,還有記得工程中要有與之對應的檔案。
此外,一般情況下還需要注意修改的配置資訊為:
Defines Module為YES
Product Module Name為專案名稱
結語
本文Demo可以在【這裡】下載到
建立OC和Swift混編工程就說到這裡。後面會說一下Swift怎麼呼叫OC的類方法(靜態方法)以及變參方法點選這裡檢視文章內容。
—End—