標籤:
這篇文章主要是介紹 Swift 與 Object-C 之間進行互動的代碼,主要分為兩個部分。一個是 Swift 項目調用 Object-C 的類,另一個是 Object-C 項目調用 Swift 類。過程是很簡單,但是對於沒接觸過的人來說,還是存在一點難度的。
你可以在 GitHub 上下載此文章相關的原始碼:Swift-Objective-C-Mutual(https://github.com/GarveyCalvin/Swift-Objective-C-Mutual)
一、Swift 調用 Object-C
現在來說說正題吧,目的是“使用 Swift 調用 Object-C” ,那麼我們先來準備一下。我們需要驗證以下問題:
1.如何調用 Object-C 的類方法;
2.如何調用 Object-C 的執行個體方法;
3.如何訪問 Object-C 的屬性
我們建立一個 Swift 項目,項目建立完成後,添加 Person 類,添加的語言為 Object-C 。
點擊 Next 後會有一個彈窗,詢問你是否需要建立一個橋接,就是與 Object-C 串連的一個橋樑。它會幫我們建立一個標頭檔,命名方式為“項目名稱-Bridging-Header.h”,當然這裡我們選 Yes。
我們的結構目錄變成這樣,我這裡建立的橋接檔案名稱為“SwiftCallObject-C-Bridging-Header.h”。
這個檔案建好以後,是沒有自動幫我們匯入標頭檔的,因此我們需要匯入需要被調用的 Object-C 類標頭檔,這樣我們的 Swift 才能正確地調用 Object-C。
//// Use this file to import your target‘s public headers that you would like to expose to Swift.//#import "Person.h"
我們來看看 Person 類的代碼,這個類寶義了一個 name 的屬性,和一個 print 執行個體方法,還有一個 personWithName: 方法,主要是示範給你們如何調用這些。先來看 Person.h 。
//// Person.h// SwiftCallObject-C//// Created by baijiawei on 15/5/14.// Copyright (c) 2015年 GarveyCalvin. All rights reserved.//#import <Foundation/Foundation.h>@interface Person : NSObject@property (strong, nonatomic) NSString *name;- (void)print;+ (id)personWithName:(NSString *)name;@end
Person.m 。
//// Person.m// SwiftCallObject-C//// Created by baijiawei on 15/5/14.// Copyright (c) 2015年 GarveyCalvin. All rights reserved.//#import "Person.h"@implementation Person- (void)print{ NSLog(@"name is %@", self.name);}+ (id)personWithName:(NSString *)name{ Person *person = [[Person alloc] init]; person.name = name; return person;}@end
調用方法如下。
var person = Person() // 執行個體化對象person.name = "Garvey" // 訪問對象屬性person.print() // 調用對象方法var personC = Person.personWithName("Calvin") as! Person // 調用 Person 的類方法,返回一個它的執行個體personC.print() // 調用對象方法
二、Object-C 調用 Swift
同樣的,我們需要建立一個 Object-C 的項目,然後建立 Swift 的類。我們先來建立 Person 類。
如果你是第在 Object-C 項目裡第一次建立 Swift 的類,那麼依舊會有視窗提示,詢問你是否需要建立橋接檔案。然而這裡有一個問題,如果你選擇 NO ,意思就是不建立橋接檔案,那麼它將不會預設幫你產生對應的調用代碼; 如果你選擇 Yes, 那麼它將預設幫你產生對應的調用代碼。那麼具體是什麼意思呢?。
現在先來看一下 Person 類的代碼,很簡單,只有一個方法和一個屬性。
//// Person.swift// Object_CCallSwift//// Created by baijiawei on 15/5/17.// Copyright (c) 2015年 GarveyCalvin. All rights reserved.//import Cocoa@objc class Person: NSObject { var name: String? func print() { println("person name is \(name)") }}
注意:Object-C 代用的 Swift 代碼,Swift 類在 class 前需要添加關鍵字@“@objc”,否則,Xcode將不會為你維護標頭檔。
這裡先說明一下,在 Object-C 中調用 Swift 時,Xcode 會協助我們自動產生標頭檔,不需要我們去維護。然而這裡有一個前提,你必須建立好橋接檔案,否則...。
當我們需要使用時,引入的檔案名稱為“工程名稱-Swift.h”。
#import "Object_CCallSwift-Swift.h"
引入後我們就可以點擊標頭檔,剛剛提及過標頭檔幾次了,現在我們來看看標頭檔的代碼,只截取關鍵區段。
我們可以看到有 Person 類的相關代碼,風格是 Object-C ,應該是 Xcode 為我們轉碼了。謹記,在 Object-C 調用 Swift 端代碼時,Swift 類的 class 前需要加“@objc”關鍵字。
常見問題
引入標頭檔時出錯
網上的 Object-C 項目調用 Object-C 代碼會遇到的問題,現在網上熱門的文章,絕大部分都是存在錯誤的,只要你不夠細心,你就很有可能被“入網”。
例如是這篇文章:http://www.ituring.com.cn/tupubarticle/2687。該文章錯誤點,#import "工程名-swift.h":
錯在 HelloWorld-swift.h ,其中 swift 的 開頭字母 S 必須是大寫的!我就是因為這個原因,找了好久都沒發現到,也是因為太過於相信網上的文章緣故吧(這裡我不是在怪作者)。或許是 Xcode 更新後或是 Swift 語言更新後所作的改動吧,所以才會導致這個原因。
有一個辦法可以確認你的橋接檔案全稱,在項目的設定裡可以看到:
可以很清晰地看見,正確的寫法是“工程名-Swift.h”,只要把這個填對了,後面的調用就簡單多了。
博文GarveyCalvin
博文出處:http://www.cnblogs.com/GarveyCalvin/
本文著作權歸作者和部落格園共有,歡迎轉載,但須保留此段聲明,並給出原文連結,謝謝合作!
Swift 與 Object-C 互動 (Swift版本為:1.2)