非转义参数与自我错误的隐式捕获

时间:2016-10-01 21:11:51

标签: ios swift closures swift3

我有一个简化的结构,它执行以下操作:

  1. 调用函数检查用户访问其联系人的授权状态。函数的完成处理程序返回truefalse

  2. 在所述函数中,如果状态未确定,则它请求访问联系人,并为函数的完成处理程序返回true或false。

  3. 返回完成处理程序时,该值用于确定是否修改结构上的属性。

  4. 以下是代码:

    // import Contacts
    
    struct Foo {
    
        var allowedAccess: Bool
    
        mutating func doSomething() {
            checkStatus(complete: { success in
                if success {
                    allowedAccess = true
                }
            })
        }
    
        private func checkStatus(complete: (_ success: Bool) -> Void) {
    
            if CNContactStore.authorizationStatus(for: .contacts) == .notDetermined {
                CNContactStore().requestAccess(for: .contacts, completionHandler: { success, error in
                    return success ? complete(true) : complete(false)
                })
            } else {
                complete(false)
            }
        }
    }
    

    以上代码在requestAccess上引发了错误:

     return success ? complete(true) : complete(false)
    
      

    关闭使用非转义参数'完成'可能允许它逃脱

    好的,我添加了@escaping

    // Identical code above
    private func checkStatus(complete: @escaping (_ success: Bool) -> Void) {
    // Identical code above
    

    现在它在doSomething上抛出错误:

    allowedAccess = true
    
      

    Closure不能隐式捕获变异的自身参数

    它是一个错误或另一个错误。我该如何防止这种情况?

0 个答案:

没有答案