国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C > 正文

C語言中調用Swift函數實例詳解

2020-01-26 14:00:08
字體:
來源:轉載
供稿:網友

C語言中調用Swift函數實例詳解

在Apple官方的《Using Swift with Cocoa and Objectgive-C》一書中詳細地介紹了如何在Objective-C中使用Swift的類以及如何在Swift中使用Objective-C中的類。在后半部分也介紹了如何在Swift中使用C函數,不過對于如何在C語言中使用Swift函數卻只字未提。這里我就為大家分享一下如何在C語言中調用Swift函數。

我們首先要知道的是,所有Swift函數都屬于閉包。其次,Swift函數的調用約定與Apple為Clang編譯器貢獻的Blocks語法一致。因此,我們需要通過使用Blocks調用約定將Swift函數導入到C語言中。由于在C語言中無法直接聲明Blocks調用約定的函數,因此我們可以通過定義全局的指向Blocks的對象指針來實現。

下面我們創建一個名為SwiftTest的macOS系統上的Swift工程。然后新建一個名為test.c的C源文件,如果Xcode沒有彈出是否新建bridging-header文件,那么我們可以新增一個Objective-C源文件,最后把它給移除。這里,我們必須在工程里包含SwiftTest-Bridging-Header.h這個頭文件。

然后我們編輯此頭文件:

extern void (^ __nonnull SwiftFunc)(void);extern void CFuncTest(void);

這里聲明的全局指向void(^)(void)類型的Block的引用對象。

然后我們再看test.c源文件:

void (^SwiftFunc)(void) = NULL;void CFuncTest(void){  SwiftFunc();}

我們定義SwiftFunc全局對象,將它初始化為空。

然后在ViewController.swift中編輯以下內容:

// 這里是對SwiftFunc的實現private func swiftFuncImpl() {  print("This is a Swift function!");}class ViewController: NSViewController {    override func viewDidLoad() {    super.viewDidLoad()    // 這里對定義在test.c中的SwiftFunc進行初始化    SwiftFunc = swiftFuncImpl    // 這里用dispatch_async來測試SwiftFunc是否一直被hold著    dispatch_async(dispatch_get_main_queue()) {            CFuncTest()    }  }}

當調用了test.c中定義的CFuncTest函數之后,該函數里將直接調用SwiftFunc這一Block引用對象,從而達到了在C語言中調用了Swift中函數的目的。

以上就是C語言中調用Swift函數的介紹,如有疑問可以留言或者到本站社區交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 治县。| 宜良县| 江油市| 鹤山市| 北安市| 昌乐县| 大城县| 林州市| 瓦房店市| 门头沟区| 衡南县| 新蔡县| 英山县| 綦江县| 中方县| 三台县| 孟津县| 湾仔区| 岑巩县| 佳木斯市| 五家渠市| 尼勒克县| 元阳县| 桃源县| 右玉县| 景德镇市| 凤城市| 安达市| 兴化市| 霍邱县| 瓮安县| 宜宾市| 离岛区| 平邑县| 新巴尔虎右旗| 神木县| 江油市| 华安县| 府谷县| 大洼县| 旌德县|