Swift无法从linphone sdk中的c回调调用self

Swift无法从linphone sdk中的c回调调用self,c,swift,callback,linphone,linphone-sdk,C,Swift,Callback,Linphone,Linphone Sdk,我在尝试从c回调调用Swift实例方法时遇到问题 错误:无法从捕获上下文的闭包中形成C函数指针 linphone_core_cbs_set_registration_state_changed(cbs) { (lc, cfg, state, message) in switch state{ case LinphoneRegistrationOk: print("LinphoneRegistrationOk")

我在尝试从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.passUnrepairedSelf.toOpaque并使用Unmanaged.fromOpaquecontext.takeUnrepairedValue将其转换回是最佳解决方案

但根据您的lc、cfg、state和message的小片段,它们似乎都不是上下文指针。所以找回自我仍然是可能的,但可能更复杂。因为您需要创建一个全局/静态数据块,可以从闭包内部以安全的方式访问该数据块。以下是您如何做到这一点的一些想法:

1如果您知道这是安全的,您可以只使用一个简单的全局/静态

2您可以使用线程本地存储并存储指向self的指针,并以与使用void*参数和非托管相同的方式来回转换它。当然,这需要在存储值的同一线程上引发C回调


3如果您有权访问Swift和C都可以访问的唯一标识符,并且该标识符将在回调中继续有效和可访问,则您可以创建一个类型为[UniqueIdentifierAccessibleByWiftAndC:TypeOfSelf]的映射,并使用该映射返回self。

可能重复的“谢谢您”解决方案是高效的