標籤:ios 遊戲 swift 手機遊戲
如果已經有了一個老的iOS應用,它是使用Objective-C編寫的,而它的一些新功能需要採用Swift來編寫,這時就可以從Objective-C調用Swift。
Objective-C調用Swift時不需要橋接標頭檔,而是需要Xcode產生的標頭檔。這種檔案由Xcode產生,不需要我們維護,對於開發人員也是不可見的。如所示,它能夠將Swift中的類暴露給Objective-C,它的命名是:<工程名>-swift.h。我們需要將該標頭檔引入到Objective-C檔案中,而且Swift中的類需要聲明為@objc。
建立Objective-C工程
為了能夠更好地介紹混合搭配調用,我們首先建立一個Objective-C工程。出於簡單考慮,我們可以建立一個Mac OS X命令列工程。
啟動Xcode 6,然後單擊File→New→Project菜單,在開啟的Choose atemplate for your new project介面中選擇“OS X→Application→Command Line Tool”工程模板(如所示)。
接著單擊“Next”按鈕,隨即出現如所示的介面。
在Product Name中輸入“HelloWorld”,在Language中選擇Objective-C,其他的項目可以結合自己的實際情況輸入內容。相關的工程選項設定完成後,單擊“Next”按鈕,後面的步類似。
建立成功後的介面如所示,在左邊的導覽列中產生了一個main.m檔案。開啟main.m檔案,可以在右邊的代碼介面中看到它的代碼,我們還可以在這裡編寫代碼。
在Objective-C工程中添加Swift類
我們剛剛建立了Objective-C的工程,需要添加Swift類到工程中。具體過程是,右鍵選擇HelloWorld組,選擇菜單中的“New File…”彈出建立檔案模板對話方塊。如所示,選擇OS X→Source→Cocoa Class。
接著單擊“Next”按鈕,隨即出現下所示的介面。在Class中輸入“SwiftObject”,在Language中選擇Swift,其他的選項保持預設值就可以了。
相關選項設定完成後,單擊“Next”按鈕,進入儲存檔案介面,根據提示選擇存放檔案的位置,然後單擊“Create”按鈕建立Swift類。如果工程中沒有橋接標頭檔,在建立過程中,Xcode也會提示我們是否添加橋接標頭檔,可以選擇不添加。
調用代碼
Swift的SwiftObject建立完成後,我們會在Xcode工程中看到新增加的SwiftObject.swift檔案。
SwiftObject.swift代碼如下:
import Foundation ① @objc class SwiftObject: NSObject { ② Func sayHello(greeting : String, withName name : String) ->String { ③ var string = "Hi," + namestring += greeting return string; }}
上述代碼第①行引入了Foundation架構的標頭檔。第②行代碼定義SwiftObject類,SwiftObject類繼承自NSObject類。另外,我們在類前面聲明為@objc,@objc所聲明的類能夠被Objective-C訪問,@objc還可以修飾屬性。
第③行代碼定義了sayHello方法,它有兩個參數,第一個參數不需要指定外部參數名,第二個參數(除了第一個以後所有的參數)需要指定外部參數名,例如withName是name參數的外部參數名。這是為了方便在Objective-C中調用。
下面看Objective-C端的代碼,main.m檔案代碼如下:
#import <Foundation/Foundation.h>#import "HelloWorld-swift.h" ① int main(intargc, const char * argv[]) { SwiftObject *sobj = [[SwiftObjectalloc] init]; ②NSString *hello = [sobjsayHello:@"Good morning"withName:@"Tony"]; ③ NSLog(@"%@",hello); ④ return 0;}
上述代碼第①行引入標頭檔HelloWorld-swift.h,它是Objective-C調用Swift對象所必需的,它的命名規則是“<工程名>-swift.h”。
第②行代碼執行個體化SwiftObject對象,SwiftObject是Swift中定義的類。第③行代碼調用SwiftObject的sayHello方法,它在Objective-C中被調用時的方法和參數命名與SwiftObject的方法和參數之間的對應關係如所示。
第④行代碼NSLog(@"%@",hello)用於輸出結果,輸出結果如下:
2014-07-05 14:25:43.879HelloWorld[3266:303] Hi,TonyGood morning
這樣就實現了在Objective-C中調用Swift代碼,我們可以藉助於這樣的調用充分利用已有的Swift檔案,減少重複編寫代碼,提高工作效率。
更多內容請關注國內第一本Swift圖書《Swift開發指南》本書交流討論網站:http://www.51work6.com/swift.php歡迎加入Swift技術討論群:362298485
歡迎關注智捷iOS課堂公用平台