首页 > 解决方案 > Swift Combine:如何指定 tryMap(_:) 的错误类型?

问题描述

在 Combine 框架中,我们可以Error在使用tryMap.

但是,我们如何才能更具体地了解Error类型?

例如,

let publisher = urlSession.dataTaskPublisher(for: request).tryMap { (data, response) -> (Data, HTTPURLResponse) in
      guard let response = response as? HTTPURLResponse else {
        throw URLError(.cannotParseResponse)
      }
      return (data, response)
}

如何指定Errorthis 的类型publisher?我想使用URLError而不是Error.

setFailureType(to:)Combine框架中找到了方法。但是,它不适用于tryMap(_:).

标签: iosswiftxcodemacoscombine

解决方案


setFailureType(to:)只是强制具有 failure type 的发布者的失败类型NevertryMap总是Error用作错误类型,因为任何Error可能在闭包体中抛出,所以你需要使用mapError强制URLError类型:

let map_error = publisher.mapError({ error -> URLError in
    switch (error) {
    case let url_error as URLError:
        return url_error
    default:
        return URLError(.unknown)
    }
})

推荐阅读