Swift不能用于函数指针吗?

Mik*_*ike 9 c xcode lua ios 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);
Run Code Online (Sandbox Code Playgroud)

我使用桥接头来访问库,从我的Swift代码中我可以毫无困难地调用lua_setuservalue.但是,如果我尝试调用lua_callk,我会"使用未解析的标识符'lua_callk'".如果我从lua_callk的声明中删除函数指针,我不再收到此错误.任何帮助都非常感谢.

Jim*_*yes 17

这个答案涉及Swift语言的早期版本,可能不再可靠.

虽然在Swift 中没有 C函数指针,但仍然可以使用swift闭包,它们作为块传递给C函数.

这样做需要在C中使用一些"填充"例程来获取块并将其包装在C函数中.以下演示了它的工作原理.

迅速:

func foo(myInt: CInt) -> CInt {
    return myInt
}

var closure: (CInt) -> CInt = foo;

my_c_function(closure)
Run Code Online (Sandbox Code Playgroud)

C:

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

当然,您选择使用闭合装置,以及如何存储和调用它以供使用取决于您.但这应该给你一个开始.


TiL*_*gic 10

从beta 3开始,Apple已经提供了函数指针,但是它们只能被引用而不被称为.

使用Swift与Cocoa和Objective-C

功能指针

C函数指针被导入到Swift中CFunctionPointer<Type>,其中Type是Swift函数类型.例如,具有int (*)(void)C语言类型的函数指针被导入Swift asCFunctionPointer<() -> Int32>

Beta 3发行说明(PDF)

函数指针现在也被导入,可以被引用和传递.但是,您无法调用C函数指针或将闭包转换为C函数指针类型.