標籤:手機遊戲 swift 移動 遊戲
Swift調用Objective-C需要一個名為“<工程名>-Bridging-Header.h”的橋接標頭檔,如所示。橋接標頭檔的作用是為Swift調用Objective-C對象搭建一個橋,它的命名必須是“<工程名>- Bridging-Header.h”,我們需要在橋接標頭檔中引入Objective-C標頭檔,而且橋接標頭檔是需要管理和維護的。
建立Swift工程
為了能夠更好地介紹混合搭配調用,我們首先建立一個Swift工程。出於簡單考慮,我們可以建立一個Mac OS X命令列工程,而不是一個iOS工程。
啟動Xcode 6,然後單擊File→New→Project菜單,在開啟的Choose a template for your new project介面中選擇“OS X→Application→Command Line Tool”工程模板
接著單擊“Next”按鈕,隨即出現如所示的介面。
我們可以按照提示並結合自己的實際情況和需要輸入相關內容。下面簡要說明一18-3中的工程選項。
Product Name:工程名。
Organization Name:組織名。
Organization Identifier:組織標識(很重要)。一般情況下,這裡輸入的是組織名或公司的網域名稱(如net.cocoagame),類似於Java中的包命名。
Bundle Identifier:捆綁標識符(很重要)。該標識符由Product Name + Organization Identifier構成。因為在App Store上發布應用的時候會用到它,所以它的命名不可重複。
Language:開發語言選擇。在這裡我們可以選擇開發應用所使用的語言,在Xcode 6中可以選擇Swift和Objective-C。
相關工程選項設定完成後,單擊“Next”按鈕,進入下一級介面。根據提示選擇存放檔案的位置,然後單擊“Create”按鈕,出現如所示的介面。
在左邊的導覽列中開啟main.swift檔案,會看到如所示的代碼介面,我們可以在這裡編寫Swift代碼。
在Swift工程中添加Objective-C類
我們剛剛建立了Swift的工程,還需要調用其他Objective-C類來實現某些功能,需要添加Objective-C類到Swift工程中。具體過程是,右鍵選擇HelloWorld組,然後選擇菜單中的“New File…”彈出建立檔案模板對話方塊,如所示,選擇“OS X→Source→Cocoa Class”。
接著單擊“Next”按鈕,隨即出現如所示的介面。在Class中輸入“ObjCObject”,在Language中選擇Objective-C,其他的選項保持預設值就可以了。
相關選項設定完成後,單擊“Next”按鈕,進入儲存檔案介面,根據提示選擇存放檔案的位置,然後單擊“Create”按鈕建立Objective-C類。如果是第一次建立Objective-C類,那麼儲存完成的時候,Xcode會提示我們是否添加橋接標頭檔,如所示,彈出一個對話方塊,我們應該選擇“Yes”,之後會在工程中建立橋接標頭檔HelloWorld-Bridging-Header.h。
調用代碼
Objective-C的ObjCObject建立完成後,我們會在Xcode工程中看到新增加的兩個檔案ObjCObject.h和ObjCObject.m。本書並不打算過多地介紹Objective-C語言,但為了更好地理解Swift與Objective-C的互相調用,我們還是簡單地解釋一下Objective-C代碼。
ObjCObject.h代碼如下:
#import <Foundation/Foundation.h>①
@interface ObjCObject : NSObject②
-(NSString*)sayHello:(NSString*)greeting withName: (NSString*)name;③
@end
ObjCObject.h檔案是Objective-C的標頭檔,我們在這裡定義類,聲明類的成員變數和方法。第①行代碼引入Foundation架構的標頭檔。第②行代碼定義類ObjCObject,它繼承自NSObject父類。NSObject類是所有Objective-C的根類。第③行代碼聲明了執行個體方法sayHello: withName:,它有兩個參數greeting和name。
ObjCObject.m代碼如下:
#import "ObjCObject.h"①
@implementation ObjCObject
-(NSString*)sayHello:(NSString*)greeting withName: (NSString*)name②
{
NSString *string = [NSStringstringWithFormat:@"Hi,%@ %@.",name,greeting];
return string;
}
@end
上述代碼第①行引入ObjCObject.h標頭檔,第②行代碼定義sayHello: withName:方法。
下面我們再來看看Swift調用檔案main.swift的代碼:
import Foundation①
varobj : ObjCObject = ObjCObject()②
var hello = obj.sayHello("Good morning", withName:"Tony")③
println(hello)④
上述代碼第①行的import Foundation語句是引入Foundation架構,類似於Objective-C的#import <Foundation/Foundation.h>語句,關於Foundation架構我們會在下一章介紹。
第②行代碼聲明並執行個體化ObjCObject類的執行個體obj。ObjCObject就是Objective-C裡定義的ObjCObject。
第③行代碼調用ObjCObject類的sayHello: withName:方法。要注意Swift調用時的方法名和參數與Objective-C中該方法的方法名和參數的對應關係,如所示。
第④行代碼列印輸出結果,輸出結果如下:
Hi,Tony Good morning.
要使Swift能夠調用Objective-C,還必須在橋接標頭檔中引入Objective-C標頭檔。HelloWorld- Bridging-Header.h代碼如下:
#import "ObjCObject.h"
很簡單,只有一行代碼,如果還有其他的Objective-C標頭檔,都需要在此引入。
這樣就實現了在Swift中調用Objective-C代碼,我們可以藉助於這樣的調用充分地利用已有的Objective-C檔案,減少重複編寫代碼,提供工作效率。
至此,整個工程建立完畢。18-10所示,點擊左上方的“運行”按鈕 即可查看運行結果。
更多內容請關注國內第一本Swift圖書《Swift開發指南》本書交流討論網站:http://www.51work6.com/swift.php歡迎加入Swift技術討論群:362298485
歡迎關注智捷iOS課堂公用平台