注:本文章已默认读者会使用C语言与Swift混编,本文是在混编成功之后的基础上实现
Swift
调用C语言
的方式比较简单,网上资料也较多,反之C语言
调用Swift
的资料相对较少(目前我只找到这一篇 如何在C语言中调用Swift函数,且调用方式与本文不同)。其实也比较简单,稍微需要了解的是C语言与Swift中类型对应关系,类型错误会崩溃或者接收不到参数。先提供一个类型对照表:
了解类型对应关系后,接下来的就比较容易了,例如我有个需求,C语言需要调用一个showLog
的方法将日志字符串传给Swift用于UI界面显示(不是在控制台打印)。实现此需求共需要2步骤
第一步:
在C语言的文件中声明void showLog(char* logStr)
函数,只需要声明,不需要实现方法。
第二步:
C语言方法参数是一个字符串的指针,从上面的参照表可以知道Char
类型对应CChar
类型,那么Char
的指针类型则对应UnsafePointer<CChar>
类型,在Swift中声明一个与C语言一样名字的全局函数,并用@_silgen_name
标记唯一
@_silgen_name("showLog")
public func showLog(logStr: UnsafePointer<CChar>) {
print("收到C语言log: \(String(cString: logStr))")
}
到此,在C语言中调用void showLog(char* logStr)
,Swift中showLog(logStr: UnsafePointer<CChar>)
就会被调用并接收到参数了。
它的原理其实就是在LLVM
编译后,C语言与Swift生成的东西是一样的,那么在C语言中声明了这个方法而不实现,把实现放在Swift中,那么程序运行时C语言在调用这个方法时,会去查找这个方法的实现,编译后生成的东西一样那肯定可以正常交流,于是就找到Swift中的方法并调用了,大概是这个意思
网友评论