C語言

當前位置 /首頁/計算機/C語言/列表

C語言中Swift函式呼叫例項

C語言中呼叫Swift函式可以通過定義全域性的指向Blocks的物件指標來實現,下面是小編分享的例項,一起來看一下吧。

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全域性物件,將它初始化為空。

然後在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中函式的目的。