我有一个简化的结构,它执行以下操作:
调用函数检查用户访问其联系人的授权状态。函数的完成处理程序返回true
或false
。
在所述函数中,如果状态未确定,则它请求访问联系人,并为函数的完成处理程序返回true或false。
返回完成处理程序时,该值用于确定是否修改结构上的属性。
以下是代码:
// 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不能隐式捕获变异的自身参数
它是一个错误或另一个错误。我该如何防止这种情况?