尝试对委托使用结果类型时出错

时间:2019-06-21 11:22:47

标签: swift protocols swift5

我试图拨打网络电话,而不是使用回调,而是尝试使用委托。而是使用结果类型,其中.Sucsess为T:可解码,.failure为错误。在.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")
        }

此行会产生错误,如果我将肯定的枚举传递给Error或试图从dataTask传递错误,它将产生错误信息

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

1 个答案:

答案 0 :(得分:1)

那么,您有两个问题,与“这是什么类型?”这个问题有关。 Swift对类型非常严格,因此您需要弄清楚这一点。

  • .networkConnectionLost不是错误。这是错误的 code 。要打包错误时,需要将Error对象传递给Result。例如,URLError(URLError.networkConnectionLost)是一个错误。

  • 短语Result<T, NetworkError>毫无意义。结果已经已经了。您的工作是解决已经存在的泛型。您可以通过指定类型来做到这一点。

例如,您可以声明:

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

然后可以说(作为测试):

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

或(假设电影是可解码的):

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

证明我们的类型正确,您可以继续围绕该示例代码构建实际代码。