Objective-C調用Swift

若是已經有了一個老的iOS應用,它是使用Objective-C編寫的,而它的一些新功能須要採用Swift來編寫,這時就能夠從Objective-C調用Swift。php

Objective-C調用Swift時不須要橋接頭文件,而是須要Xcode生成的頭文件。這種文件由Xcode生成,不須要咱們維護,對於開發人員也是不可見的。以下圖所示,它可以將Swift中的類暴露給Objective-C,它的命名是:<工程名>-swift.h。咱們須要將該頭文件引入到Objective-C文件中,並且Swift中的類須要聲明爲@objc。html

建立Objective-C工程swift

爲了可以更好地介紹混合搭配調用,咱們首先建立一個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」按鈕,後面的步相似。spa

建立成功後的界面以下圖所示,在左邊的導航欄中生成了一個main.m文件。打開main.m文件,能夠在右邊的代碼界面中看到它的代碼,咱們還能夠在這裏編寫代碼。.net

 

在Objective-C工程中添加Swift類命令行

咱們剛剛建立了Objective-C的工程,須要添加Swift類到工程中。具體過程是,右鍵選擇HelloWorld組,選擇菜單中的「New File…」彈出新建文件模板對話框。以下圖所示,選擇OS X→Source→Cocoa Class。code

 

接着單擊「Next」按鈕,隨即出現如圖下所示的界面。在Class中輸入「SwiftObject」,在Language中選擇Swift,其餘的選項保持默認值就能夠了。

 

相關選項設置完成後,單擊「Next」按鈕,進入保存文件界面,根據提示選擇存放文件的位置,而後單擊「Create」按鈕建立Swift類。若是工程中沒有橋接頭文件,在建立過程當中,Xcode也會提示咱們是否添加橋接頭文件,能夠選擇不添加。

調用代碼

Swift的SwiftObject建立完成後,咱們會在Xcode工程中看到新增長的SwiftObject.swift文件。

SwiftObject.swift代碼以下:

 

[html] view plaincopy在CODE上查看代碼片派生到個人代碼片

 

  1. import Foundation                                                               ①  

  2.    

  3. @objc class SwiftObject: NSObject {                     ②  

  4.    

  5. Func sayHello(greeting : String, withName name : String) ->String {      ③  

  6.    

  7. var string = "Hi," + name  

  8. string += greeting  

  9.    

  10. return string;  

  11.     }  

  12. }  

 

上述代碼第①行引入了Foundation框架的頭文件。第②行代碼定義SwiftObject類,SwiftObject類繼承自NSObject類。另外,咱們在類前面聲明爲@objc ,@objc所聲明的類可以被Objective-C訪問,@objc還能夠修飾屬性。

第③行代碼定義了sayHello方法,它有兩個參數,第一個參數不須要指定外部參數名,第二個參數(除了第一個之後全部的參數)須要指定外部參數名,例如withName是name參數的外部參數名。這是爲了方便在Objective-C中調用。

下面看Objective-C端的代碼,main.m文件代碼以下:

 

[html] view plaincopy在CODE上查看代碼片派生到個人代碼片

 

  1. #import <Foundation/Foundation.h>  

  2. #import "HelloWorld-swift.h"                            ①  

  3.    

  4. int main(intargc, const char * argv[]) {  

  5.    

  6. SwiftObject *sobj = [[SwiftObjectalloc] init];          ②  

  7. NSString *hello = [sobjsayHello:@"Good morning"withName:@"Tony"];        ③  

  8.    

  9. NSLog(@"%@",hello);                                                         ④  

  10.    

  11. return 0;  

  12. }  

 

 

 上述代碼第①行引入頭文件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課堂微信公共平臺

相關文章
相關標籤/搜索