我正在尝试在 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);
我使用桥接 header 来访问该库,并且从我的 Swift 代码中我可以毫无问题地调用 lua_setuservalue。但是,如果我尝试调用 lua_callk,我会得到“使用未解析的标识符‘lua_callk’”。如果我从 lua_callk 的声明中删除函数指针,我就不会再收到此错误。非常感谢任何帮助。
最佳答案
此答案指的是早期版本的 Swift 语言,可能不再可靠。
虽然 C 函数指针在 Swift 中不可用,但您仍然可以使用作为 block 传递给 C 函数的 swift 闭包。
这样做需要 C 中的一些“垫片”例程来获取 block 并将其包装在 C 函数中。下面演示了它是如何工作的。
swift :
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);
}
当然,您选择如何处理瓶盖,以及如何存储和召回它以供使用取决于您。但这应该给你一个开始。
关于ios - Swift 不能使用函数指针吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24088312/