Получение ошибки при попытке использовать тип результата с делегатом - PullRequest
0 голосов
/ 21 июня 2019

Я пытаюсь выполнить сетевой вызов, и вместо использования обратного вызова я пытаюсь использовать делегат. Используя тип результата, где .Sucsess - T: Decodable, а .failure - Error. Передача моей модели в .Sucsess работает, но при попытке передать ошибку я получаю ошибку компиляции «Общий параметр« T »не может быть выведен», что я пропускаю?

protocol NetworkServiceDelegate: class {
    func decodableResponce<T: Decodable>(_ result: Result<T, NetworkError>)
}

let dataTask:URLSessionTask = session.dataTask(with: url) { (dataOrNil, responceOrNil, errOrNil) in
            if let error = errOrNil {
                switch error {
                case URLError.networkConnectionLost,URLError.notConnectedToInternet:
                    print("no network connection")
                    self.delegate?.decodableResponce(Result.failure(.networkConnectionLost))
                case URLError.cannotFindHost, URLError.notConnectedToInternet:
                    print("cant find the host, could be to busy, try again in a little while")
                case URLError.cancelled:
                    // if cancelled with the cancelled method the complition is still called
                    print("dont bother the user, we're doing what they want")
                default:
                    print("error = \(error.localizedDescription)")
                }
                return
            }
            guard let httpResponce:HTTPURLResponse = responceOrNil as? HTTPURLResponse
                else{
                    print("not an http responce")
                    return
            }
            guard let dataResponse = dataOrNil,
                errOrNil == nil else {
                    print(errOrNil?.localizedDescription ?? "Response Error")
                    return }
            do{
                //here dataResponse received from a network request
                let decoder = JSONDecoder()
                let modelArray = try decoder.decode([Movie].self, from:
                    dataResponse) //Decode JSON Response Data
                DispatchQueue.main.async {
                    self.delegate?.decodableResponce(Result.success(modelArray))
                }
            } catch let parsingError {
                print("Error", parsingError)
            }
            print("http status = \(httpResponce.statusCode)")
            print("completed")
        }

эта строка генерирует ошибку, она не показывается, если я передаю свое перечисление, которое подтверждает ошибку или пытается передать ошибку из dataTask

self.delegate?.decodableResponce(Result.failure(.networkConnectionLost))

1 Ответ

1 голос
/ 28 июня 2019

Ну, у вас есть две проблемы, связанные с вопросом "что это за тип?"Swift очень строго относится к типам, поэтому вам нужно прояснить это.

  • .networkConnectionLost не является ошибкой.Это ошибка код .Вам нужно передать объект Error в Result, если вы хотите упаковать ошибку.Например, URLError(URLError.networkConnectionLost) является ошибкой.

  • Фраза Result<T, NetworkError> не имеет смысла.Результат уже универсальный.Ваша задача состоит в том, чтобы разрешить то обобщение, которое уже есть.Это можно сделать, указав тип.

Так, например, вы можете объявить:

func decodableResponce(_ result: Result<Decodable, Error>)

Затем можно сказать (в качестве тестов):

decodableResponce(.failure(URLError(URLError.networkConnectionLost)))

или (при условии, что фильм является декодируемым):

decodableResponce(.success([Movie()]))

Это доказывает, что у нас есть правильные типы, и вы можете приступить к созданию своего фактического кода на основе этого примера кода.

...