将给定的 Publishers Failure 类型设置为 Never in Combine

Set a given Publishers Failure type to Never in Combine

有没有办法将给定的 AnyPublisher<AnyType, SomeError> 转换为 AnyPublisher<AnyType, Never>

错误类型为 Never 的发布者意味着它根本不会抛出错误。它总会带来价值。

要获得永远不会抛出错误的发布者,您有 2 个解决方案:

1/ 捕获所有可能的错误:

let publisher: AnyPublisher<AnyType, SomeError> = //...

publisher.catch { error in
  // handle the error here. The `catch` operator requires to
  // return a "fallback value" as a publisher
  return Just(/* ... */) // as an example
}

2/ 如果您确定发布者不会抛出任何错误,您可以使用 .assertNoFailure(),这将转换您的发布者。请注意,这是通过 .assertNoFailure() 传递的错误,您的应用将立即崩溃。

使用 replaceError 运算符。这要求您发出一个 AnyType 值,如果上游出现错误,该值将从此处沿着管道向下发送。

例如:

URLSession.shared.dataTaskPublisher(for: url)
    .map {[=10=].data} // *
    .replaceError(with: Data()) // *
    // ...

从管道的这一点开始,我们保证将收到来自数据任务完成的数据或(如果存在网络错误)空数据。从这一点开始,管道的失败类型是从不。