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,我会得到“use of unresolved identifier 'lua_callk'”错误。如果我从 lua_callk 的声明中删除函数指针,则不再出现此错误。非常感谢任何帮助。

点赞
用户504963
用户504963

在苹果的文档中指出C 函数指针不会被导入到 Swift

2014-06-06 21:02:56
用户996600
用户996600

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

虽然 Swift 中没有 C 函数指针,但你仍然可以使用作为块传递给 C 函数的 Swift 闭包。

这需要一些 C 中的“shim”例程来接收块并将其包装在 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);
}

当然,你选择如何处理闭包以及如何存储和调用它,取决于你自己。但这应该为你提供了一个起点。

2014-06-09 04:18:50
用户1388418
用户1388418

函数指针

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

引用自使用 Swift 与 Cocoa 和 Objective-C


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

引用自 Beta 3 发行说明 (PDF)

2014-07-23 17:43:20
用户5329717
用户5329717

Swift 3.1以来,可以像这样调用任意地址的函数指针:

let fakeIMP = unsafeBitCast(0x1e233d1d0, to: IMP.self)
unsafeBitCast(fakeIMP,to:(@convention(c)()->Void).self)()

假设这是特定的调用签名:

void cFunction();
2019-05-23 18:32:40