在Apple官方的《Using Swift with Cocoa and Objectgive-C》一书中详细地介绍了如何在Objective-C中使用Swift的类以及如何在Swift中使用Objective-C中的类。在后半部分也介绍了如何在Swift中使用C函数,不过对于如何在C语言中使用Swift函数却只字未提。这里我就为你们分享一下如何在C语言中调用Swift函数。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这个头文件。async
而后咱们编辑此头文件:ide
extern void (^ __nonnull SwiftFunc)(void);
extern void CFuncTest(void);
这里声明的全局指向void(^)(void)类型的Block的引用对象。函数
而后咱们再看test.c源文件:测试
void (^SwiftFunc)(void) = NULL; void CFuncTest(void) { SwiftFunc(); }
咱们定义SwiftFunc全局对象,将它初始化为空。spa
而后在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中函数的目的。code