无法推断 flatMap 中的类型

unable to infer type in flatMap

NetworkManager class 具有 fetchData 从 Internet 获取数据的通用函数。

class NetworkManager {
    
    func fetchData<T: Decodable>(url: URL) -> AnyPublisher<T, ErrorType> {
        URLSession
            .shared
            .dataTaskPublisher(for: url)
            .tryMap { data, _ in
                return try JSONDecoder().decode(T.self, from: data)
            }
            .mapError { error -> ErrorType in
                switch error {
                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()
    }

}

HomeRepositoryImpl class 中,我正在尝试使用 AnyPublisher<[CountryDayOneResponse], ErrorType>[ 从特定的 url 获取数据=25=] return 值。我想对响应数组进行排序,所以我在 NetworkManager 上使用了 flatMap,如下所示:

func getCountryStats(for countryName: String) -> AnyPublisher<[CountryDayOneResponse], ErrorType> {
    let url = RestEndpoints.countryStats(countryName: countryName).endpoint()

    return NetworkManager().fetchData(url: url)
        .flatMap { result -> AnyPublisher<[CountryDayOneResponse], ErrorType> in
            switch result {
            case .success(var response):
                let filteredCountry = Array(response.sorted(by: {[=11=].date > .date}))
                response = filteredCountry
                return response
            case .failure(let error):
                return error
            }
        }
        .eraseToAnyPublisher()
}

但我收到 无法推断当前上下文中闭包参数的类型 'result' 错误。

据我在您的代码中看到的...您还没有告诉它 result 是什么。即使以人类的身份阅读它,我也不知道它应该是什么。

您的 fetchData 函数 returns 泛型类型 AnyPublisher T

您的 getCountryStats 函数将通用类型 T 转换为 flatMap 函数和 returns 类型 [CountryDayOneResponse]AnyPublisher

但是您绝不会告诉它 T 是什么。你甚至不告诉它 result 是什么。只有flatMap函数的输出。

result 的预期类型是什么?

评论后编辑。

如果您希望 result 成为 [CountryOneDayResponse] 那么这段代码就可以...

func getCountryStats(for countryName: String) -> AnyPublisher<[CountryDayOneResponse], ErrorType> {
    let url = RestEndpoints.countryStats(countryName: countryName).endpoint()

    let publisher: AnyPublisher<[CountryDayOneResponse], ErrorType> = NetworkManager().fetchData(url: url)

    return publisher
        .flatMap{ Just(Array([=10=].sorted(by: {[=10=].date > .date}))) }
        .eraseToAnyPublisher()
}

您不需要像在 flatMap 中那样打开结果,因为 flatMap 只有在发布者 returns a non-error.因此,您可以将 flatMap 的输入视为发布者的成功类型 [CountryOneDayResponse]