ios - Swift 不能使用函数指针吗?

标签 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);

我使用桥接 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/

相关文章:

ios - PayUMoney IOS SDK 中未找到 CitrusGraphics 框架

c - 包含行和列的乘法表

c - 堆栈在 c 中弹出时显示内存地址

iphone - Objective C - UIWebview 只加载网页的特定部分?

swift - UITextChecker、Swift 的单词学习——不起作用

iOS 8 : UIButton appearance font

ios - 如何从tableViewCell的类中回调tableView的类中的函数

ios - 使用 Parse API 将用户名设置为 Facebook 名称。

c - 将 malloc 字符串索引初始化为 NULL

设置 "conditional"断点时 Xcode 调试器很慢?