尝试将结果类型与委托一起使用时出错
Getting error when trying to use Result type with delegate
我尝试进行网络调用,而不是使用回调,我尝试使用委托 instead.using 结果类型,其中 .Sucsess 是 T: Decodable,.failure 是 Error。在 .Sucsess 中传递我的模型是有效的,但是当试图传递一个错误时,我得到一个编译错误 "Generic parameter 'T' could not be inferred" 我错过了什么?
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")
}
此行生成错误,如果我将 cumfirms 的枚举传递给 Error 或尝试从 dataTask 传递错误,它不会发生错误
self.delegate?.decodableResponce(Result.failure(.networkConnectionLost))
嗯,你有两个问题,与问题有关 "what type is this?" Swift 对类型非常严格,所以你需要弄清楚这一点。
.networkConnectionLost
不是错误。这是一个错误 code。当你想打包错误时,你需要将一个错误对象传递给一个结果。例如,URLError(URLError.networkConnectionLost)
是一个错误。
短语 Result<T, NetworkError>
毫无意义。结果是已经一个泛型。您的工作是 解决 已经存在的通用问题。您可以通过指定类型来做到这一点。
例如,您可以声明:
func decodableResponce(_ result: Result<Decodable, Error>)
然后可以说(作为测试):
decodableResponce(.failure(URLError(URLError.networkConnectionLost)))
或(假设电影是可解码的):
decodableResponce(.success([Movie()]))
这证明我们的类型是正确的,您可以继续围绕该示例代码构建您的实际代码。
我尝试进行网络调用,而不是使用回调,我尝试使用委托 instead.using 结果类型,其中 .Sucsess 是 T: Decodable,.failure 是 Error。在 .Sucsess 中传递我的模型是有效的,但是当试图传递一个错误时,我得到一个编译错误 "Generic parameter 'T' could not be inferred" 我错过了什么?
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")
}
此行生成错误,如果我将 cumfirms 的枚举传递给 Error 或尝试从 dataTask 传递错误,它不会发生错误
self.delegate?.decodableResponce(Result.failure(.networkConnectionLost))
嗯,你有两个问题,与问题有关 "what type is this?" Swift 对类型非常严格,所以你需要弄清楚这一点。
.networkConnectionLost
不是错误。这是一个错误 code。当你想打包错误时,你需要将一个错误对象传递给一个结果。例如,URLError(URLError.networkConnectionLost)
是一个错误。短语
Result<T, NetworkError>
毫无意义。结果是已经一个泛型。您的工作是 解决 已经存在的通用问题。您可以通过指定类型来做到这一点。
例如,您可以声明:
func decodableResponce(_ result: Result<Decodable, Error>)
然后可以说(作为测试):
decodableResponce(.failure(URLError(URLError.networkConnectionLost)))
或(假设电影是可解码的):
decodableResponce(.success([Movie()]))
这证明我们的类型是正确的,您可以继续围绕该示例代码构建您的实际代码。