1. 程式人生 > >swift與OC混編(建立混編工程)

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檔案

新建Swift類名為SwiftDemo。點Create以後會出現這樣一個彈出提示:

建立橋接檔案

這是因為Swift和OC進行混編的時候需要一箇中間的橋接檔案。橋接檔案中需要匯入Swift類中引用到的OC類的標頭檔案。

點選Create Bridging Header,工程中會多出兩個檔案,一個是SwiftDemo.swift檔案和橋接檔案MixDemo-Bridging-Header.h。新建完以後工程結構如圖:

工程結構

簡單的方法呼叫

OC呼叫Swift

新建完成Swift類以後,我們來Build一下工程,perfect模擬器跑的很歡快,雖然什麼程式碼也沒有寫。

下面我們在SwiftDemo.swift檔案裡寫點東西。程式碼如下:

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—