c - 将 C 回调(没有上下文)包装到 Swift 闭包中

标签 c swift callback closures function-pointers

我正在尝试通过使用 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/

相关文章:

swift - 如何使用 iOS 9 将单元格 append 到表格 View ?

javascript - 传递一个函数作为参数,然后在jquery函数中执行

python - F2PY 与具有回调参数和假定形状数组参数的子例程

C++无效引用问题

c - 在 OSX 中从控制台读取输入

c - 了解 SPARC 汇编中函数调用的基本示例

ios - 在没有 segue 的情况下在 Swift 中设置接收委托(delegate)

ios - Swift-Xcode : why isn't my self. tableView.reloadData() 调用将 promise 的数据加载到我的表/单元格中?

c - 由于类型转换,二进制值到浮点值的转换不起作用

c - 为什么下面的代码是错误的?