我正在尝试在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 ,我会“使用未解析的标识符'lua_callk'”。如果我从 lua_callk 的声明中删除了函数指针,我就不会再出现此错误。非常感谢任何帮助。
答案 0 :(得分:17)
此答案涉及Swift语言的早期版本,可能不再可靠。
虽然Swift中的C函数指针不,但你仍然可以使用swift闭包,它们作为块传递给C函数。
这样做需要一些" shim" 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);
}
当然,您选择使用闭合装置,以及如何存储和调用它以供使用取决于您。但这应该会给你一个开始。
答案 1 :(得分:10)
从beta 3开始,Apple已经提供了函数指针,但是它们只能被引用而不被称为。
Using Swift with Cocoa and Objective-C
功能指针
C函数指针作为
CFunctionPointer<Type>
导入Swift,其中Type
是a Swift函数类型。例如,在C中具有类型int (*)(void)
的函数指针 被导入到Swift中CFunctionPointer<() -> Int32>
Beta 3 Release Notes(PDF)
现在也导入了函数指针,可以引用和传递它们。然而, 你不能调用C函数指针或将闭包转换为C函数指针类型。
答案 2 :(得分:2)
在Apple documentation中,我们注意到C function pointers are not imported in Swift
。
答案 3 :(得分:0)
自 Swift 3.1 起,可以这样调用任意地址作为函数指针:
let fakeIMP = unsafeBitCast(0x1e233d1d0, to: IMP.self)
unsafeBitCast(fakeIMP,to:(@convention(c)()->Void).self)()
假定为此^特定的呼叫签名:
void cFunction();