C語言中Swift函數調用實例
- C語言
- 關注:1.17W次
C語言中調用Swift函數可以通過定義全局的指向Blocks的對象指針來實現,下面是小編分享的實例,一起來看一下吧。
在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全局對象,將它初始化為空。
然後在t中編輯以下內容:
// 這裏是對SwiftFunc的實現
private func swiftFuncImpl() {
print("This is a Swift function!");
}
class ViewController: NSViewController {
override func viewDidLoad() {
DidLoad()
// 這裏對定義在test.c中的SwiftFunc進行初始化
SwiftFunc = swiftFuncImpl
// 這裏用dispatch_async來測試SwiftFunc是否一直被hold着
dispatch_async(dispatch_get_main_queue()) {
CFuncTest()
}
}
}
當調用了test.c中定義的CFuncTest函數之後,該函數裏將直接調用SwiftFunc這一Block引用對象,從而達到了在C語言中調用了Swift中函數的目的。
- 文章版權屬於文章作者所有,轉載請註明 https://xuezhezhai.com/zh-hk/jsj/cyuyan/o6xxmn.html