在進行Swift和C之間的相互調用時,有必要先瞭解一下兩種語言之間的類型轉換關係: 下在還是先演示一下如何在Swift里對C的方法進行調用,創建一個Swift的項目: 在項目里創建C代碼文件: 這個時候會提示你是否要生成Bridging Header,選擇創建。 文件創建完成後的代碼結構如下,可以看 ...
在進行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 |
文件創建完成後的代碼結構如下,可以看到有一個文件名為:<工程名>-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里的方法。