Swift联合收割机处理HTTP状态代码错误

Swift联合收割机处理HTTP状态代码错误,swift,combine,Swift,Combine,我在读这篇文章:关于RayWenderlich如何使用combine。他们有一个例子,它从API获取数据,但不处理HTTP状态码。我想添加它,但到目前为止,我无法这样做 根据这个答案,您可以添加一个tryMap,但是XCode开始显示错误,例如:无法推断通用参数“T” 代码如下: 扩展WeatherFetcher:WeatherFetchable{ func每周天气预报( 城市:字符串 )->任何出版商{ 退货预测(带:MakeWeeklyForecast组件(带城市:城市)) } 私人func

我在读这篇文章:关于RayWenderlich如何使用combine。他们有一个例子,它从API获取数据,但不处理HTTP状态码。我想添加它,但到目前为止,我无法这样做

根据这个答案,您可以添加一个
tryMap
,但是XCode开始显示错误,例如:
无法推断通用参数“T”

代码如下:

扩展WeatherFetcher:WeatherFetchable{ func每周天气预报( 城市:字符串 )->任何出版商{ 退货预测(带:MakeWeeklyForecast组件(带城市:城市)) } 私人func预测( 带组件:URLComponents )->AnyPublisher,其中T:可解码{ guard let url=components.url else{ let error=WeatherError.network(说明:“无法创建URL”) 返回失败(错误:error).eraseToAnyPublisher() } return session.dataTaskPublisher(用于:URLRequest(url:url)) .mapError{中的错误 .network(描述:error.localizedDescription) } .flatMap(maxpublisher:.max(1)){pair in 解码(成对数据) } .删除任何发布者() } } 我想补充一点

.tryMap{数据,在中响应
guard let httpResponse=响应为?HTTPURLResponse,

200.我认为您可以简单地用
tryMap
替换
flatMap
块。不从
tryMap
返回数据,它应该被解码。因此
返回数据
行应该是
返回try JSONDecoder()。解码(T.self,from:data)

private func forecast(带组件:URLComponents)->AnyPublisher其中T:Decodable{
guard let url=components.url else{
let error=WeatherError.network(说明:“无法创建URL”)
返回失败(错误:error).eraseToAnyPublisher()
}
return session.dataTaskPublisher(用于:URLRequest(url:url))
.tryMap{数据,以
guard let httpResponse=响应为?HTTPURLResponse,
200..
private func forecast<T>(with components: URLComponents) -> AnyPublisher<T, WeatherError> where T: Decodable {
guard let url = components.url else {
    let error = WeatherError.network(description: "Couldn't create URL")
    return Fail(error: error).eraseToAnyPublisher()
}
return session.dataTaskPublisher(for: URLRequest(url: url))
    .tryMap { data, response in
        guard let httpResponse = response as? HTTPURLResponse,
            200..<300 ~= httpResponse.statusCode else {
                switch (response as! HTTPURLResponse).statusCode {
                case (400...499):
            throw ServiceErrors.internalError((response as! HTTPURLResponse).statusCode)
                default:
                    throw ServiceErrors.serverError((response as! HTTPURLResponse).statusCode)
                }
        }
        return try JSONDecoder().decode(T.self, from: data)
}
.mapError { error in
    WeatherError() // some kind of error
}
.eraseToAnyPublisher()