Swift 3 中的 GLFW 回调签名

GLFW callback signature in Swift 3

我正在尝试在 Swift 3 中设置一个简单的 GLFW 应用程序。目前我无法尝试设置回调函数。

func setupGLFW() {
  ...
  glfwSetErrorCallback(errorCallback)
  ...
}

func errorCallback(error: Int32, description: UnsafePointer<Int8>) {
  ...
}

这在 Swift 2 中有效,但现在我收到此错误:

cannot convert value of type '(Int32, UnsafePointer) -> ()' to expected argument type 'GLFWerrorfun!'

在查阅文档中的Interacting with C APIs部分后,我也尝试了这个签名:

func errorCallback(error: CInt, description: UnsafePointer<CChar>) {
  ...
}

这会导致同样的错误。

GLFWerrorfun 的 C 签名是:

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

试试:

func errorCallback(error: Int32, description: UnsafePointer<Int8>?) {

(请不要错过UnsafePointer<Int8>后面的?。)

在Swift3中,nullable指针被导入为Optional指针,所以你需要?

您可以在调用 glfwSetErrorCallback:

的地方内联回调
glfwSetErrorCallback { (error, description) in
    //
}

或者,使用存储在变量中的闭包:

let callback: GLFWerrorfun = { (error, description) in
    //
}

glfwSetErrorCallback(callback)

您可以通过 Option + 左键单击符号来查看此 typedef 是如何桥接到 Swift 的:

在这种情况下,我没有实际的 GLFW headers,所以我只是将声明放在桥接 Header 中。您生成的界面可能会显示更多信息。