C語(yǔ)言中調(diào)用Swift函數(shù)實(shí)例詳解
C語(yǔ)言中調(diào)用Swift函數(shù)實(shí)例詳解
在Apple官方的《Using Swift with Cocoa and Objectgive-C》一書(shū)中詳細(xì)地介紹了如何在Objective-C中使用Swift的類以及如何在Swift中使用Objective-C中的類。在后半部分也介紹了如何在Swift中使用C函數(shù),不過(guò)對(duì)于如何在C語(yǔ)言中使用Swift函數(shù)卻只字未提。這里我就為大家分享一下如何在C語(yǔ)言中調(diào)用Swift函數(shù)。
我們首先要知道的是,所有Swift函數(shù)都屬于閉包。其次,Swift函數(shù)的調(diào)用約定與Apple為Clang編譯器貢獻(xiàn)的Blocks語(yǔ)法一致。因此,我們需要通過(guò)使用Blocks調(diào)用約定將Swift函數(shù)導(dǎo)入到C語(yǔ)言中。由于在C語(yǔ)言中無(wú)法直接聲明Blocks調(diào)用約定的函數(shù),因此我們可以通過(guò)定義全局的指向Blocks的對(duì)象指針來(lái)實(shí)現(xiàn)。
下面我們創(chuàng)建一個(gè)名為SwiftTest的macOS系統(tǒng)上的Swift工程。然后新建一個(gè)名為test.c的C源文件,如果Xcode沒(méi)有彈出是否新建bridging-header文件,那么我們可以新增一個(gè)Objective-C源文件,最后把它給移除。這里,我們必須在工程里包含SwiftTest-Bridging-Header.h這個(gè)頭文件。
然后我們編輯此頭文件:
extern void (^ __nonnull SwiftFunc)(void); extern void CFuncTest(void);
這里聲明的全局指向void(^)(void)類型的Block的引用對(duì)象。
然后我們?cè)倏磘est.c源文件:
void (^SwiftFunc)(void) = NULL; void CFuncTest(void) { SwiftFunc(); }
我們定義SwiftFunc全局對(duì)象,將它初始化為空。
然后在ViewController.swift中編輯以下內(nèi)容:
// 這里是對(duì)SwiftFunc的實(shí)現(xiàn) private func swiftFuncImpl() { print("This is a Swift function!"); } class ViewController: NSViewController { override func viewDidLoad() { super.viewDidLoad() // 這里對(duì)定義在test.c中的SwiftFunc進(jìn)行初始化 SwiftFunc = swiftFuncImpl // 這里用dispatch_async來(lái)測(cè)試SwiftFunc是否一直被hold著 dispatch_async(dispatch_get_main_queue()) { CFuncTest() } } }
當(dāng)調(diào)用了test.c中定義的CFuncTest函數(shù)之后,該函數(shù)里將直接調(diào)用SwiftFunc這一Block引用對(duì)象,從而達(dá)到了在C語(yǔ)言中調(diào)用了Swift中函數(shù)的目的。
以上就是C語(yǔ)言中調(diào)用Swift函數(shù)的介紹,如有疑問(wèn)可以留言或者到本站社區(qū)交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
相關(guān)文章
c語(yǔ)言實(shí)現(xiàn)向上取整計(jì)算方法
這篇文章主要介紹了c語(yǔ)言實(shí)現(xiàn)向上取整計(jì)算方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07c++如何控制對(duì)象的創(chuàng)建方式(禁止創(chuàng)建棧對(duì)象or堆對(duì)象)和創(chuàng)建的數(shù)量
這篇文章主要介紹了c++如何控制對(duì)象的創(chuàng)建方式和創(chuàng)建的數(shù)量,幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下2020-08-08C/C++中數(shù)據(jù)類型轉(zhuǎn)換詳解及其作用介紹
這篇文章主要介紹了C/C++中數(shù)據(jù)類型轉(zhuǎn)換詳解及其作用,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-09-09C++學(xué)習(xí)進(jìn)階之Makefile基礎(chǔ)用法詳解
Makefile 通常指的是一個(gè)含有一系列命令(directive)的,通過(guò) Make自動(dòng)化編譯工具,幫助 C/C++ 程序?qū)崿F(xiàn)自動(dòng)編譯目標(biāo)文件的文件,這篇文章主要給大家介紹了關(guān)于C++學(xué)習(xí)進(jìn)階之Makefile基礎(chǔ)用法的相關(guān)資料,需要的朋友可以參考下2021-07-07