C語(yǔ)言調(diào)用Swift方法并傳參數(shù)

注:本文章已默認(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è)意思

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容