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,我会得到“使用未parsing的标识符'lua_callk'”。 如果我从lua_callk声明中删除函数指针,我不会再得到这个错误。 任何帮助是相当赞赏。
苹果公司已经提供了beta 3的函数指针,但是它们只能被引用而不被调用。
在Cocoa和Objective-C中使用Swift
函数指针
C函数指针作为
CFunctionPointer<Type>
被导入到Swift中,其中Type
是一个Swift函数types。 例如,在C中具有int (*)(void)
types的函数指针将作为CFunctionPointer<() -> Int32>
导入到Swift中,
Beta 3发行说明 (PDF)
函数指针现在也被导入,可以被引用和传递。 但是,不能调用C函数指针或将闭包转换为C函数指针types。
这个答案指的是早期版本的Swift语言,可能不再可靠。
虽然C函数指针在Swift中不可用,但仍然可以使用传递给C函数的快捷闭包作为块。
这样做需要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); }
当然,你selectclosures的方式,以及如何存储和调用它,取决于你。 但是,这应该给你一个开始。
在Apple 文档中注意到C function pointers are not imported in Swift
。
- Xamarin.Forms实现AndHud和BTProgressHud
- 查询应用程序的购买历史清单
- UITextView在使用iOS 7 SDK构build时包装文本
- 包含外部C库和Xcode
- AFNetworking从asynchronous任务iOS返回值
- 如何使用AFJSONRequestOperation返回一个响应对象
- iOS 7蓝牙输出不适用于AVAudioSessionCategoryPlayAndRecord
- 使用后端Spring Security Java EE服务器和前端iOS Objective-C客户端进行身份validation
- 内存泄漏:通过简单的设备运动logging稳定增加内存使用量