Swift Combine:如何指定tryMap(_:)的错误类型?

Wil*_*Cat 10 macos xcode ios swift combine

在 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)
}
Run Code Online (Sandbox Code Playgroud)

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

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

Eva*_*ubl 9

setFailureType(to:)只是强制一个失败类型为失败类型的发布者NevertryMap始终Error用作错误类型,因为 anyError可能会在闭包主体中抛出,因此您需要使用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)
    }
})
Run Code Online (Sandbox Code Playgroud)

  • 很好的解释,但为什么这里是“error.self”而不是“error”?纯粹的风格,但这可能更简单,如 `mapError { $0 as? 网址错误??URLError(.unknown) }`. (2认同)