解码空数组不抛出指定数组
decoding empty array not throwing specified array
我有 RestManager class 用于从 Internet 获取数据。
我想在空数组被解码函数 returns 错误时进行特殊处理。
所以我做了这个
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
首先,JSON 数组永远不是像 [AnyObject]
这样的引用类型,解码后的数组是 [Any]
.
意外行为的发生是因为您没有考虑 mapError
正文中的 ErrorType
。如果正在解码空数组,则抛出的 ErrorType.empty
既不是 DecodingError
也不是 URLError
,因此返回默认大小写 .general
我有 RestManager class 用于从 Internet 获取数据。
我想在空数组被解码函数 returns 错误时进行特殊处理。
所以我做了这个
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
首先,JSON 数组永远不是像 [AnyObject]
这样的引用类型,解码后的数组是 [Any]
.
意外行为的发生是因为您没有考虑 mapError
正文中的 ErrorType
。如果正在解码空数组,则抛出的 ErrorType.empty
既不是 DecodingError
也不是 URLError
,因此返回默认大小写 .general