閱讀397 返回首頁    go 阿裏雲 go 技術社區[雲棲]


Swift調用Objective-C

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文件,減少重複編寫代碼,提供工作效率。
至此,整個工程創建完畢。如圖所示,點擊左上角的“運行”按鈕 即可查看運行結果。
 




更多內容請關注國內第一本Swift圖書《Swift開發指南》
本書交流討論網站:https://www.51work6.com/swift.php
歡迎加入Swift技術討論群:362298485

歡迎關注智捷iOS課堂微信公共平台






最後更新:2017-04-03 05:39:53

  上一篇:go 錯誤 ““NameSpace.Test_Index.Dispose(bool)”: 沒有找到適合的方法來重寫
  下一篇:go Swift中的注釋以及表達式