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()
}