Неверное преобразование из функции выброса типа '(_, _) throws -> ()' в тип функции без выброса '(Bool, Error?) -> Void - PullRequest
0 голосов
/ 07 января 2020

У меня очень простой класс, который выбирает контакты. Теперь мне нужно создать эту функцию с бросками.

Так как store.requestAccess не является функцией выброса, поэтому я не могу выбросить ошибку из этого смещения. Итак, я получаю эту ошибку

Неправильное преобразование из функции выброса типа '(_, _) throws -> ()' в тип функции без броска '(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 Ответ

1 голос
/ 07 января 2020

Вы не можете бросить из обработчика завершения без броска. Это асинхронно! Точно так же, как вы не можете вернуть значение из асинхронной функции, так и вы не можете выбросить туда. В конце концов, чтобы поймать бросок, бросок должен был бы двигаться назад во времени, когда была вызвана исходная функция. И это метафизически невозможно.

Вместо этого вы должны предоставить другой обработчик завершения, чтобы вы могли вызывать его с параметром Error из обработчика завершения без обработки. Именно поэтому был придуман тип Result, чтобы вы могли распространять ошибки в асинхронной ситуации.

...