c - Swift调用C调用Swift?

标签 c swift callback

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

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

还有,C和Swift可以共享全局变量吗?朝哪个方向?

最佳答案

做这种事情的批准方法是将 swift 函数/闭包分配给 C 函数指针。

但是如果你看一下 Swift 源代码,它在几个地方使用了未记录的 @_silgen_name 属性来赋予 swift 函数 C 兼容的名称,因此它们可以直接从 C 和 C++ 调用

所以这有效(在 XCode 9 beta 中测试)

主.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 稳定性有人吗??

关于c - Swift调用C调用Swift?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43672263/

相关文章:

c - 华氏度到摄氏度选择选项

ios - 共享表 - 排除 UIActivityType 中未作为类型属性提供的选项

ios - 当 uiviewcontroller 被取消并且有一个事件的 urlsessiontask 时如何防止崩溃

javascript - 将数据从 child 传递给 parent React Hooks

javascript - 向 for 循环添加回调

c - C的sizeof()函数

c - 配置 Visual Studio 进行调试时出现“访问被拒绝”错误

c - 如何存储指向在 Fsm 中接受参数的函数的指针?

ios - UITableViewCell 自动调整大小问题 Swift

java - Android - 适配器数据更改后,滚动到 ListFragment 中 ListView 中的位置