Swift不能使用函数指针吗?

我试图在Swift中使用C库,而且我无法调用任何函数指针作为其参数之一。 例如,我试图在Swift中使用的lua.h文件的一部分如下所示:

LUA_API void (lua_setuservalue) (lua_State *L, int idx); typedef int (*lua_CFunction) (lua_State *L); LUA_API void (lua_callk) (lua_State *L, int nargs, int nresults, int ctx, lua_CFunction k); 

我使用桥接头来访问库,从我的Swift代码,我可以毫不费力地调用lua_setuservalue 。 但是,如果我尝试调用lua_callk,我会得到“使用未parsing的标识符'lua_callk'”。 如果我从lua_callk声明中删除函数指针,我不会再得到这个错误。 任何帮助是相当赞赏。

苹果公司已经提供了beta 3的函数指针,但是它们只能被引用而不被调用。

在Cocoa和Objective-C中使用Swift

函数指针

C函数指针作为CFunctionPointer<Type>被导入到Swift中,其中Type是一个Swift函数types。 例如,在C中具有int (*)(void)types的函数指针将作为CFunctionPointer<() -> Int32>导入到Swift中,

Beta 3发行说明 (PDF)

函数指针现在也被导入,可以被引用和传递。 但是,不能调用C函数指针或将闭包转换为C函数指针types。

这个答案指的是早期版本的Swift语言,可能不再可靠。

虽然C函数指针在Swift中不可用,但仍然可以使用传递给C函数的快捷闭包作为块。

这样做需要C语言中的一些“填充”例程来取代该块并将其包装在C函数中。 以下演示如何工作。

迅速:

 func foo(myInt: CInt) -> CInt { return myInt } var closure: (CInt) -> CInt = foo; my_c_function(closure) 

C:

 void my_c_function(int (^closure)(int)) { int x = closure(10); printf("x is %d\n", x); } 

当然,你selectclosures的方式,以及如何存储和调用它,取决于你。 但是,这应该给你一个开始。

在Apple 文档中注意到C function pointers are not imported in Swift