开发者问题收集

从 C 到 Swift 的函数回调

2014-06-08
2037

我有这个 C 函数,它只是回调作为参数传递的另一个函数

void call_my_function(void (*callback_function)())
{
    callback_function();
}

这是 C 测试代码:

void func_to_call()    // a simple test function passed in as a callback
{
    printf("function correctly called");
}

void test()   // entry point
{
    void (*foo)();
    foo = &func_to_call;
    call_my_function(foo);     // pass the address of "func_to_call()" to "call_my_function()"
}

本质上,从 test() ,我调用 call_my_function() 并传入 func_to_call() 的地址,然后 call_my_function() 回调 func_to_call()

从 swift 中我正确地看到了函数 test()func_to_call() ,但似乎

void call_my_function(void (*callback_function)())

无法识别(使用未解析的标识符) 如果我删除参数 void (*callback_function)() ,那么该函数就会被识别再次。

我该怎么做才能将 Swift 函数地址传递给 C 并让它回调?可能吗? 谢谢

1个回答

Apple 在开发论坛上向我确认,目前不支持此功能,并要求我在 bugreporter 上填写新请求。

此外,我向读者提供了另一个细节:

似乎在编译的二进制文件中,所有 swift 函数的符号都已可用,并且已桥接​​以便从 C 访问(即使在仅限 swift 的应用程序中)

我制作了一个名为 FunctionTest 的应用程序,iPhone App 使用此函数在 swift 文件中

func thisIsATestFunction() { println("test")

编译,然后从终端:

nc /Users/xxx/Library/Developer/Xcode/DerivedData/FunctionTest-hhrbtzsuyrdoftfnbakosvenaiak/Build/Products/Debug-iphonesimulator/FunctionTest.app/FunctionTest

     U _NSStringFromClass
     U _OBJC_CLASS_$_NSString
     U _OBJC_CLASS_$_UIResponder
     U _OBJC_CLASS_$_UIViewController
     U _OBJC_CLASS_$_UIWindow
000088c8 S _OBJC_CLASS_$__TtC12FunctionTest11AppDelegate
00008888 S _OBJC_CLASS_$__TtC12FunctionTest14ViewController
.........
.........
00003840 T __TF12FunctionTest19thisIsATestFunctionFT_T_          <--- this is my test function

从 c 调用地址 00003840 执行该函数

void (* func)() = 0x00003840;
func();    // the swift function is executed

所以我认为这已经是正在进行的工作......希望他们能在下一个版本中实现这个功能:-)

LombaX
2014-06-11