蘋果系統開發中的混合編程(2):Swift和C的相互調用,系統開發swift
在進行Swift和C之間的相互調用時,有必要先瞭解一下兩種語言之間的類型轉換關係:
C 類型 |
Swift 類型 |
bool |
CBool |
char, signed char |
CChar |
unsigned char |
CUnsignedChar |
short |
CShort |
unsigned short |
CUnsignedShort |
int |
CInt |
unsigned int |
CUnsignedInt |
long |
CLong |
unsigned long |
CUnsignedLong |
long long |
CLongLong |
unsigned long long |
CUnsignedLongLong |
wchar_t |
CWideChar |
char16_t |
CChar16 |
char32_t |
CChar32 |
float |
CFloat |
double |
CDouble |
下在還是先示範一下如何在Swift裡對C的方法進行調用,建立一個Swift的項目: 在項目裡建立C代碼檔案: 這個時候會提示你是否要產生Bridging Header,選擇建立。
檔案建立完成後的代碼結構如下,可以看到有一個檔案名稱為:<工程名>-Bridging-Header.h的檔案,這就是在Swift和C之間進行橋接的檔案。
在項目的配置中可以看到這個橋接檔案是在這裡指定的,所以如果忘記建立了這個檔案也不用擔心,自己建立一個在這裡指定一下就可以了。
實現C的代碼: MyCFile.h
MyCFile.c
在橋接檔案中引入C代碼的標頭檔,非常簡單,直接import一下就可以了。
然後在swift檔案中就可以直接調用C的方法:
下面我們再添加一些代碼,來實現兩點:一、C代碼中對Swift代碼的調用二、資料的相互傳遞(以字串為例) MyCFile.h
C對Swift方法的調用,其實相當於是註冊一個全域的函數指標,可以參見SwiftCallbackFun的定義。
這個裡面有一些OC的文法:^ 操作符,說明這是一個閉包,也就是Block,Swift裡的函數都是以閉包的形式傳遞進來的。__nonnull 表示對象不應該為空白,因為在混編的時候,Swift編譯器並不知道一個Objective-C對象到底是optional還是non-optional,所以在Xcode 6.3引入了一個Objective-C的新特性:nullability annotations,這裡可以定義為 __nullable 或 __nonnull 。 MyCFile.c這裡有一個對Swift方法的回調。
main.swift
Swift裡的代碼,要注意的有兩點:一、在Swift裡對C中傳入字串處理的方式二、要先給全域的Callback賦值,這樣才能從C裡調用到Swift裡的方法。