Swift 之调用 C 语言

2016/06/30 永超 Swift

Swift 语言推出后,一直都与Objective-C语言相互交互的很好,可是在与C语言进行交互的时候,经常会遇到一些引用问题。但是作为一个能够和Objective-C语言进行交互的语言,与C语言之间也能够进行相互调用和混编。

在Swift 2.0 之前的版本中,使用C语言程序时,可以直接import Darwin,其中定义了一大批C语言函数以供使用。例如一下几个常见的数学计算函数:

Swift 2.0 之后,Darwin已经更改为全局类库,不需要进行导入。

func sin(x: Double) -> Double
func cos(x: Double) -> Double
func sqrt(x: Float) -> Float
func ceil(x: Double) -> Double
...

而在于其他一些第三方的C语言类库或者自定义的C语言类,该如何调用呢?

Swift调用C语言

通过{product-module-name}-Bridging-Header.h调用

我们知道,Swift中调用Objective-C语言是通过将接口暴漏在{product-module-name}-Bridging-Header.h文件的。而如果想要调用非标准库的C函数的话,可以遵循同样的方式,将C函数的头文件在桥接文件中导入即可:

// C 函数
int printC(){
    return printf("This is C printf Func~~~~");
}
// {product-module-name}-Bridging-Header.h
#import "CAPI.h"

这样设置之后,就可以在Swift文件中使用C语言的接口printC了。但是这种方式带来的弊端就是,如果C语言的函数散落在多个C语言文件中,那么在桥接文件中就需要导入多个C语言头文件才可以。

通过@_silgen_name调用

@_silgen_name其实是Swift的一个隐藏符号,作用是将某个C语言函数直接映射为Swift函数。

在Swift 2.0 之前,此隐藏符号是 @asmname

例如上面的例子中,可以使用@_silgen_nameprintC函数直接映射为Swift函数swift_print,这样就不需要在桥接文件中导入C语言头文件,甚至可以直接删掉C语言头文件。

@_silgen_name("printC") func swift_print() -> CInt

这样进行映射后,在Swift中,就可以直接使用swift_print函数了。

Search

    欢迎下载我们的APP

    Table of Contents