1. 程式人生 > >如何在 Objective-C 專案中使用 Swift 類

如何在 Objective-C 專案中使用 Swift 類

準備好 Xcode OC 專案

當我們往 OC 專案新增 Swift 檔案的時候,如果是第一次將會看見一個 Xcode 的招待框:”Would you like to configure an Objective-C bridging header?”。根據我們的主題(OC 嵌 Swift),這顯然應該不需要橋接:但是建立後有利於我們 Swift 呼叫 OC,也許未來我們需要用到,所以我們選擇 Create。檔案的目錄結構將會多出 專案名-Bridging-Header.h 檔案

圖1

也許你以為這就完事了,Xcode 幫我們做了剩下的事情,其實不是。我們還需要告訴 Xcode:”我們需要在專案裡使用 Swift 和 Objective-C”(通過配置專案)。

為了實現這點,點選您的專案 target-> Build Setting 選顯示卡。 找到 Embedded Content contains Swift Code(在Build Options中) 選項:

圖2

開啟這個配置是讓這個 target 專案包含 Swift 的程式碼,因此 Swift 的標準庫將能夠在該專案使用,官方文件說明

準備好 Swift 類

這裡我們建立了一個繼承自 UIViewcController 的 SwiftViewController 類。程式碼如下:

class SwiftViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        self.view.backgroundColor = UIColor.purpleColor()
    }
}

為了讓 OC 能夠呼叫該類,需要在類的定義前加入一個關鍵字 @objc。這是告訴編譯器在幕後進行一些額外操作(命名,建立一個不可見的標頭檔案等),讓 Swift 的程式碼暴露給 OC:

@objc class SwiftViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        self.view.backgroundColor = UIColor.purpleColor()
    }
}

準備好 Objective-C 類

最後一步,跟 OC 呼叫其他檔案一樣,需要引入一個 Xcode 生成的 Swift 標頭檔案到 OC 類裡。有一件事是,Swift 並沒有標頭檔案 - 怎麼辦呢?

其實我們需要引入的這個標頭檔案並不真實的存在 - 不是一個物理檔案。是由 Xcode 在幕後生成的虛擬檔案。檔名是根據你的專案名字而定,但是我們並不知道檔案的名字,如何 Import 呢?

繼續找到 target->Build Setting 選項卡。在 Swift Compiler – Code Generation 裡找到 Objective-C Generated Interface Header Name

圖3

我建立的專案名為 SwiftInOCDemo,因此 Xcode 生成的檔名 “SwiftInOCDemo-Swift.h”。這就是 OC 中需要引入的標頭檔案。

注意不需要引入 Xcode 生成的橋接檔案 SwiftInOCDemo-Bridging-Header.h,這個檔案是用來暴露 OC 的庫給 Swift 的。因此我們只需要引入 SwiftInOCDemo-Swift.h 即可:

#import "ViewController.h"
#import "SwiftInOCDemo-Swift.h"

@interface ViewController ()

@end

注意:也許你想問是否有多個這種 XXX-Swift.h 標頭檔案,答案是否,所有通過 @objc 關鍵字暴露的 Swift 程式碼都會被放置這個 SwiftInOCDemo-Swift.h 檔案中。因此只有一個頭檔案。

在 Objective-C 程式碼中呼叫 Swift 方法

經過上面的所有步驟,終於可以在 OC 中呼叫 Swift 方法了:

- (void)viewDidLoad {
    [super viewDidLoad];
    SwiftViewController *controller = [[SwiftViewController alloc] init];
    NSString *title = [controller myTitle];
    NSLog(@"%@", title);

    // 輸出: SwiftViewController
}

Tip: 如果你發現敲完程式碼後,編譯器報錯。不需要擔心,點選 CMD + B 編譯專案:這會強制讓編譯器檢視所有引用的類。每次你修改完 Swift 程式碼後都應該幹這件事。你也可以按住 CMD 點選 SwiftViewController 檢視原始檔程式碼。

總結

這篇文章的概念適用於所有 Objective-C 呼叫 Swift 類,包括屬性,方法和協議等。demo地址

更多閱讀