Swift不能用于函数指针吗?

时间:2014-06-06 18:19:44

标签: ios c xcode lua 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 ,我会“使用未解析的标识符'lua_callk'”。如果我从 lua_callk 的声明中删除了函数指针,我就不会再出现此错误。非常感谢任何帮助。

4 个答案:

答案 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();