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

问题描述 投票:0回答:1

我正在尝试通过包装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时,上下文似乎已被捕获

我该如何解决?

c swift callback closures function-pointers
1个回答
0
投票

使用全局变量解决

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()
© www.soinside.com 2019 - 2024. All rights reserved.