我在C中有一个非常简单的函数,它的指针传递给Swift。
void callback() {
NSLog(@"such pointer…");
}
如何使用 ONLY 指针在Swift中调用?关于简单地调用它是 NOT - 直接调用它可以正常工作。通过签名转换尝试了以下和不同的变体,但它总是崩溃:
let pointer: UnsafePointer<@convention(c)() -> ()> = UnsafePointer(bitPattern: …)
let callback: @convention(c)() -> () = pointer.memory
Swift.print(callback) // (Function)
callback() // Handling crash with signal 11...
尝试使用Callback
定义typedef void(*Callback)();
类型 - 同样的事情:
let pointer: UnsafePointer<Callback> = UnsafePointer(bitPattern: …)
let callback: Callback = pointer.memory
Swift.print(callback) // (Function)
callback() // Handling crash with signal 11...
要检查它是否实际工作并指向正确的地址,我有另一个Objective-C函数,当使用回调指针从Swift调用时,它可以正常工作。
void invokeCallback(uintptr_t callback) {
((void (*)()) callback)(); // such pointer…
}
答案 0 :(得分:4)
与Swift: How to call a C function loaded from a dylib中相同的方法应该适用于此。
Swift 3的示例(假设funcPtr
是a
UnsafeRawPointer
包含函数的地址):
// Define function type:
typealias callbackFunc = @convention(c) () -> Void
// Convert pointer to function type:
let callback = unsafeBitCast(funcPtr, to: callbackFunc.self)
// Call function:
callback()
当然,类型别名必须与实际的功能签名相匹配, 而且功能需要是一个纯粹的&#34; C函数(不是Objective-C 法)。