簡體   English   中英

Swift Combine:如何指定tryMap(_:)的錯誤類型?

[英]Swift Combine: How to specify the Error type of tryMap(_:)?

在 Combine 框架中,我們可以在使用tryMap拋出一個通用的Error協議類型。

但是,我們如何才能更具體地了解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)
}

如何指定此publisherError類型? 我想使用URLError而不是Error

我在Combine框架中找到了setFailureType(to:)方法。 但是,它不適用於tryMap(_:)

setFailureType(to:)只是強制失敗類型為Never的發布者的失敗類型。 tryMap總是使用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)
    }
})

您也可以使用flatMap完成此操作。 這將允許您同時指定OutputError類型,如下所示:

struct SomeResponseType {
    let data: Data
    let response: HTTPURLResponse
}

let publisher = urlSession.dataTaskPublisher(for: request)
    .flatMap { (data, response) -> AnyPublisher<SomeResponseType, URLError > in
      guard let response = response as? HTTPURLResponse else {
        return Fail(error: URLError(.cannotParseResponse))
            .eraseToAnyPublisher()
      }
      return Just(SomeResponseType(data: data, response: response)
          .setFailureType(to: URLError)
          .eraseToAnyPublisher()
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM