我有一个非常简单的类来获取联系人。 现在,我需要使用throws创建此函数。
由于store.requestAccess
没有抛出函数,因此我不能从该事件抛出任何错误。
所以我得到这个错误
从类型为((_,_)的throwing函数->()到无效类型为'(Bool,Error?)-> Void'的无效转换
class ContactFetcher {
enum ContactError:Error {
case permissionError
case fetchError
}
func fetchContacts(completion:@escaping(([CNContact]) -> ())) throws {
let keys = [CNContactPhoneNumbersKey] as [CNKeyDescriptor]
let fetchRequest = CNContactFetchRequest(keysToFetch: keys)
let store = CNContactStore()
var results:[CNContact] = []
store.requestAccess(for: .contacts) { (grant, error) in
if grant{
do {
try store.enumerateContacts(with: fetchRequest, usingBlock: { (contact, stop) -> Void in
results.append(contact)
})
} catch {
// throw ContactError.fetchError
}
completion(results)
} else {
throw ContactError.permissionError
print("Error \(error)")
}
}
}
}
有什么办法可以解决这个问题?
预先感谢
答案 0 :(得分:1)
您不能从非抛出完成处理程序中抛出。它是异步的!正如您不能从异步函数中返回值一样,您也不能将其扔在那里。毕竟,要捕获该异常,该异常将需要向后移动到调用原始函数时的时间。从形而上讲,这是不可能的。
相反,您必须提供另一个完成处理程序,以便可以从非抛出完成处理程序中使用Error参数对其进行调用。这就是发明Result类型的原因,以允许您通过异步情况传播错误。