无法推断 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]
。
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]
。