解码空数组不抛出指定数组

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