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

问题描述 投票:0回答:1

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

        }


    }

}

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

预先感谢

swift throw throws
1个回答
0
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.