其他人已经讨论了如何从Swift调用C代码,并且效果很好。还有其他人谈到,将Swift作为子例程调用C代码是一个坏主意,因为整个Swift运行时需要被设置。
但是我的问题是:如果我的程序是基于Swift的,并调用C子例程,但想为这些子例程提供回调,是否可能?并且如果它们采用C兼容类型参数(CInt等),那么这些C子例程能否按名称调用Swift例程?
此外,C和Swift可以共享全局变量吗?是否双向共享?
做这种事情的正确方式是将swift函数/闭包分配给C函数指针。
但是,如果您查看Swift源代码,它在几个地方使用了未记录的 @_silgen_name
属性,以赋予swift函数C兼容的名称,因此它们可以直接从C和C ++调用
所以这能够工作(在XCode 9 beta中测试过)
main.c
// declare the function. you would probably put this in a .h
int mySwiftFunc(int);
int main(int argc, const char * argv[]) {
int retVal = mySwiftFunc(42); // call swift function
printf("Hello from C: %d", retVal);
return 0;
}
SomeSwift.swift
@_silgen_name("mySwiftFunc") // give the function a C name
public func mySwiftFunc(number: Int) -> Int
{
print("Hello from Swift: \(number)")
return 69
}
但是,考虑到它没有文档,您可能不想使用它,并且它在哪些函数签名和参数类型上可以工作有点模糊。
ABI稳定性呢?
@convention(c)
将函数作为回调传递给C代码。https://dev59.com/510a5IYBdhLWcg3wD1Lb#30740730 - Alexander