Swift 调用 C,C 调用 Swift?

5

其他人已经讨论了如何从Swift调用C代码,并且效果很好。还有其他人谈到,将Swift作为子例程调用C代码是一个坏主意,因为整个Swift运行时需要被设置。

但是我的问题是:如果我的程序是基于Swift的,并调用C子例程,但想为这些子例程提供回调,是否可能?并且如果它们采用C兼容类型参数(CInt等),那么这些C子例程能否按名称调用Swift例程?

此外,C和Swift可以共享全局变量吗?是否双向共享?


Swift可以通过使用@convention(c)将函数作为回调传递给C代码。https://dev59.com/510a5IYBdhLWcg3wD1Lb#30740730 - Alexander
你可以将全局函数或文字闭包(不捕获上下文)传递给期望函数参数的 C 函数。 - Martin R
1个回答

5

做这种事情的正确方式是将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稳定性呢?


谢谢,Jon。我尝试了两种方法,最终使用了全局 Swift 函数。我的函数足够大,因此拥有一个带名称的实体真的很有帮助。然后,我将我的大类对象(在这种情况下是 GameViewController)保存在一个命名的全局变量中,以便可以明确引用我需要的任何类成员和方法。 - Joymaker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接