从类型为((_,_)的throwing函数->()到无效类型为'(Bool,Error?)-> Void的无效转换

时间:2020-01-07 07:07:12

标签: swift throw throws

我有一个非常简单的类来获取联系人。 现在,我需要使用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)")
            }

        }


    }

}

有什么办法可以解决这个问题?

预先感谢

1 个答案:

答案 0 :(得分:1)

您不能从非抛出完成处理程序中抛出。它是异步的!正如您不能从异步函数中返回值一样,您也不能将其扔在那里。毕竟,要捕获该异常,该异常将需要向后移动到调用原始函数时的时间。从形而上讲,这是不可能的。

相反,您必须提供另一个完成处理程序,以便可以从非抛出完成处理程序中使用Error参数对其进行调用。这就是发明Result类型的原因,以允许您通过异步情况传播错误。