我正在尝试通过使用 GLFW 的包装来学习 Swift
GLFW 允许添加错误回调:
GLFWAPI GLFWerrorfun glfwSetErrorCallback(GLFWerrorfun cbfun);
哪里
typedef void (* GLFWerrorfun)(int,const char*);
我尝试过谷歌搜索,但许多解决方案都涉及回调,需要代表上下文的最终参数。
上下文参数,不幸的是我这里没有。
这就是 seems it should work (虽然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()
...
}
}
}
但它一直在发射:
error: a C function pointer cannot be formed from a closure that captures context
一旦我尝试在回调中使用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()
关于c - 将 C 回调(没有上下文)包装到 Swift 闭包中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58060625/