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_name
将printC
函数直接映射为Swift函数swift_print
,这样就不需要在桥接文件中导入C语言头文件,甚至可以直接删掉C语言头文件。
@_silgen_name("printC") func swift_print() -> CInt
这样进行映射后,在Swift中,就可以直接使用swift_print
函数了。