注:本文章已默認(rèn)讀者會(huì)使用C語(yǔ)言與Swift混編,本文是在混編成功之后的基礎(chǔ)上實(shí)現(xiàn)
Swift調(diào)用C語(yǔ)言的方式比較簡(jiǎn)單,網(wǎng)上資料也較多,反之C語(yǔ)言調(diào)用Swift的資料相對(duì)較少(目前我只找到這一篇 如何在C語(yǔ)言中調(diào)用Swift函數(shù),且調(diào)用方式與本文不同)。其實(shí)也比較簡(jiǎn)單,稍微需要了解的是C語(yǔ)言與Swift中類型對(duì)應(yīng)關(guān)系,類型錯(cuò)誤會(huì)崩潰或者接收不到參數(shù)。先提供一個(gè)類型對(duì)照表:

了解類型對(duì)應(yīng)關(guān)系后,接下來(lái)的就比較容易了,例如我有個(gè)需求,C語(yǔ)言需要調(diào)用一個(gè)showLog的方法將日志字符串傳給Swift用于UI界面顯示(不是在控制臺(tái)打?。?。實(shí)現(xiàn)此需求共需要2步驟
第一步:
在C語(yǔ)言的文件中聲明void showLog(char* logStr)函數(shù),只需要聲明,不需要實(shí)現(xiàn)方法。
第二步:
C語(yǔ)言方法參數(shù)是一個(gè)字符串的指針,從上面的參照表可以知道Char類型對(duì)應(yīng)CChar類型,那么Char的指針類型則對(duì)應(yīng)UnsafePointer<CChar>類型,在Swift中聲明一個(gè)與C語(yǔ)言一樣名字的全局函數(shù),并用@_silgen_name標(biāo)記唯一
@_silgen_name("showLog")
public func showLog(logStr: UnsafePointer<CChar>) {
print("收到C語(yǔ)言log: \(String(cString: logStr))")
}
到此,在C語(yǔ)言中調(diào)用void showLog(char* logStr),Swift中showLog(logStr: UnsafePointer<CChar>)就會(huì)被調(diào)用并接收到參數(shù)了。
它的原理其實(shí)就是在LLVM編譯后,C語(yǔ)言與Swift生成的東西是一樣的,那么在C語(yǔ)言中聲明了這個(gè)方法而不實(shí)現(xiàn),把實(shí)現(xiàn)放在Swift中,那么程序運(yùn)行時(shí)C語(yǔ)言在調(diào)用這個(gè)方法時(shí),會(huì)去查找這個(gè)方法的實(shí)現(xiàn),編譯后生成的東西一樣那肯定可以正常交流,于是就找到Swift中的方法并調(diào)用了,大概是這個(gè)意思