我有用于從 Internet 獲取資料的 RestManager 類。
當空陣列被解碼函式回傳錯誤時,我想制作特殊情況。
所以我做了這個
class RestManager {
func fetchData<T: Decodable>(url: URL) -> AnyPublisher<T, ErrorType> {
URLSession
.shared
.dataTaskPublisher(for: url)
.tryMap { data, _ in
let value = try JSONDecoder().decode(T.self, from: data)
if let array = value as? [AnyObject], array.isEmpty {
throw ErrorType.empty
}
return value
}
.mapError { error -> ErrorType in
switch error {
case is Swift.DecodingError:
return ErrorType.empty
case let urlError as URLError:
switch urlError.code {
case .notConnectedToInternet, .networkConnectionLost, .timedOut:
return .noInternetConnection
case .cannotDecodeRawData, .cannotDecodeContentData:
return .empty
default:
return .general
}
default:
return .general
}
}
.eraseToAnyPublisher()
}
}
但問題是回傳 ErrorType 是.general而不是.empty
uj5u.com熱心網友回復:
首先,JSON 陣列永遠不是參考型別[AnyObject],解碼陣列是[Any].
發生意外的行為是因為您沒有ErrorType在 mapError體內考慮。如果正在解碼空陣列,則拋出ErrorType.empty的既不是 aDecodingError也不是 an ,因此回傳URLError默認情況.general
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/452934.html
