将 C 回调(无上下文)包装到 Swift 闭包中



我试图通过玩弄 GLFW 的包装器来欺骗 Swift

GLFW允许添加错误回调:

GLFWAPI GLFWerrorfun glfwSetErrorCallback(GLFWerrorfun cbfun);

哪里

typedef void (* GLFWerrorfun)(int,const char*);

我尝试谷歌搜索,但许多解决方案都提到回调,期望代表上下文的最终参数。

上下文参数,不幸的是我在这里没有它。

这似乎是它应该起作用的(尽管 OP 明确要求与我的情况类似,但没有上下文参数(:

class glfw {
typealias ErrorFun = (Int, _ description: String) -> Void
func setErrorCallback(cbFun: ErrorFun) {
// Void pointer to `self`:
let observer = UnsafeRawPointer(Unmanaged.passUnretained(self).toOpaque())
glfwSetErrorCallback { err, desc in
// Extract pointer to `self` from void pointer:
let mySelf = Unmanaged<glfw>.fromOpaque(observer).takeUnretainedValue()
...
}
}
}

但它一直在发射:

错误:无法从捕获上下文的闭包形成 C 函数指针

一旦我尝试在回调中使用observer,上下文似乎就会被捕获

我该如何解决?

使用全局变量求解

public struct glfw {
static func setErrorCallback(cbFun: @escaping ErrorFun) {
_g.errorCB = cbFun
glfwSetErrorCallback { err, desc in
_g.errorCB!(Error(rawValue: err)!, String(utf8String: desc!)!)
}        
}
var errorCB: ErrorFun?
}
var _g = glfw()

最新更新