如何确定Swift.Result和Enum的错误响应
我创建了一种使用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 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()
}
I created a method that uses Swift.Result
to return an image and an Error from a URLSession. I also created an Enum
for the errors.
When a Swift.Result
error is returned, how can I tell the difference between the 4 enums?
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()
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
首先,我将您的完成处理程序更改为仅将
sessiondatataSuskError
作为result
的错误类型,因为您从不使用任何其他类型的错误:
然后,您可以使用模式匹配来匹配4个错误案例:
如果在每种情况下都可以做不同的事情,则可以通过执行避免嵌套的开关:
如果有不同类型的错误
fetterceimage 可以产生,您只想检查四个
sessiondatataSkerror
s,您可以使用类型模式让ERROR作为SessionDatatAskError
错误。First, I would change your completion handler to only take
SessionDataTaskError
as the error type of theResult
, because you never call it with any other types ofError
:Then, you can use pattern matching to match the 4 cases of errors:
If in every case you do different things, you can avoid the nested switch by doing:
If there are different types of errors that
fetchImage
can produce and you just want to check for the fourSessionDataTaskError
s, you can use a type patternlet error as SessionDataTaskError
, and add an extra case to handle other kinds of errors.