我创建了一个使用Swift.Result从URLSession返回图像和错误的方法。我还为错误创建了一个Enum。
当返回Swift.Result错误时,如何区分4个枚举之间的区别?
fetchImage(with: url) { (result) in
switch result {
case .failure(let err):
print(err)
// how can I determine which of the 4 enum errors was returned?
/* Example
if failErr { ... }
if responseStatusCodeErr { ... }
if dataIsNil { ... }
if catchErr { ... }
*/
case .success(let img):
// ...
}
}Enum:
enum SessionDataTaskError: Error {
case failErr(Error)
case responseStatusCodeErr(Int)
case dataIsNil
case catchErr(Error)
}URLSession:
fetchImage(with url: URL, completion: @escaping (Swift.Result<[UIImage], Error>)->Void) {
URLSession.shared.dataTask(with: url) { (data, res, error) in
if let error = error {
completion(.failure(SessionDataTaskError.failErr(error)))
return
}
if let response = res as? HTTPURLResponse {
guard 200 ..< 300 ~= response.statusCode else {
completion(.failure(SessionDataTaskError.responseStatusCodeErr(response.statusCode)))
return
}
}
guard let data = data else {
completion(.failure(SessionDataTaskError.dataIsNil))
return
}
do {
// all good ...
} catch {
completion(.failure(SessionDataTaskError.catchErr(error)))
}
}.resume()
}发布于 2022-06-12 17:17:20
首先,我将将完成处理程序更改为只使用SessionDataTaskError作为Result的错误类型,因为您从不使用任何其他类型的Error调用它。
func fetchImage(with url: URL,
completion: @escaping (Swift.Result<[UIImage], SessionDataTaskError>)->Void) {然后,可以使用模式匹配来匹配以下4种错误:
fetchImage(with: url) { (result) in
switch result {
case .failure(let error):
print(error)
switch error {
case .failErr:
// ...
case .responseStatusCodeErr:
// ...
case .dataIsNil:
// ...
case .catchErr:
// ...
}
case .success(let img):
// ...
}
}如果在每种情况下都执行不同的操作,则可以通过执行以下操作来避免嵌套开关:
fetchImage(with: url) { (result) in
switch result {
case .failure(.failErr):
// ...
case .failure(.responseStatusCodeErr):
// ...
case .failure(.dataIsNil):
// ...
case .failure(.catchErr):
// ...
case .success(let img):
// ...
}
}如果fetchImage可以产生不同类型的错误,并且只想检查四个SessionDataTaskError,则可以使用类型模式let error as SessionDataTaskError,并添加一个额外的大小写来处理其他类型的错误。
fetchImage(with: url) { (result) in
switch result {
case .failure(let error as SessionDataTaskError):
print(error)
switch error {
case .failErr:
// ...
case .responseStatusCodeErr:
// ...
case .dataIsNil:
// ...
case .catchErr:
// ...
}
case .failure(let otherError):
print("Other Error:", otherError)
case .success(let img):
// ...
}
}https://stackoverflow.com/questions/72594282
复制相似问题