我正在尝试通过包装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()
...
}
}
}
但它不断射击:
错误:无法从捕获上下文的闭包中形成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()