我創建了一個用于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)
}
網址會話:
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()
}
uj5u.com熱心網友回復:
首先,我會將您的完成處理程式更改為僅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可能產生不同型別的錯誤,而您只想檢查四個SessionDataTaskErrors,則可以使用型別模式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://www.uj5u.com/qukuanlian/489111.html
標籤:IOS 迅速 枚举 nsurlsession
