尝试从 c 回调调用 Swift 实例方法时遇到问题。
错误:">C 函数指针不能从捕获上下文的闭包形成。
linphone_core_cbs_set_registration_state_changed(cbs) { (lc, cfg, state, message) in
switch state{
case LinphoneRegistrationOk:
print("LinphoneRegistrationOk")
self.call()
}
func call() {
let account = "test"
let domain = "sip.linphone.org"
let identity = "sip:" + account + "@" + domain
linphone_core_invite(lc, identity)
}
如果您能够将任意void*
作为上下文传递,那么使用Unmanaged<SelfType>.passUnretained(self).toOpaque()
并使用Unmanaged<SelfType>.fromOpaque(context).takeUnretainedValue()
将其转换回来是最好的解决方案。
但是根据你的一小段(lc, cfg, state, message)
它们似乎都不像上下文指针。因此,找回自我仍然是可能的,但可能更复杂。因为您需要创建一个全局/静态数据,这些数据可以从闭包内部以安全的方式访问。有关如何执行此操作的一些想法如下:
1)如果你知道这是安全的,你可以只用一个简单的全局/静态来做到这一点。
2)您可以使用线程本地存储并存储指向self
的指针,并以与使用void*
参数并使用Unmanaged
相同的方式来回转换它。这当然要求在存储值的同一线程上引发 C 回调。
3) 如果你可以访问 Swift 和 C 都可以访问的唯一标识符,该标识符将在你的回调中继续有效和可访问,你可以创建一个[UniqueIdentifierAccessibleBySwiftAndC: TypeOfSelf]
类型的映射,并使用它来获取self
。