【问题标题】:Combine, map() vs tryMap() operators结合,map() 与 tryMap() 运算符
【发布时间】:2020-10-21 17:31:17
【问题描述】:

我一直在玩苹果的Combine 框架,在那里我发现了几个运算符map() & tryMap()allSatisfy() & tryAllSatisfy

Combine 中的许多运算符都遵循这种模式,我想知道这意味着什么。

我经历了很多运营商,其中大多数都以try为前缀。如果有人能以最简单的方式告诉我,那将非常有帮助。

谢谢

【问题讨论】:

    标签: swift reactive-programming combine


    【解决方案1】:

    try 变体使随附的函数有机会引发错误。如果函数确实抛出错误,则该错误将传递到下游(整个管道已完成,按正常顺序失败)。

    因此,例如,map 接受一个函数,但您不能在该函数中说 throw。如果您希望能够说 throw,请改用 tryMap。以此类推。

    【讨论】:

      【解决方案2】:

      map 运算符不能引入故障。如果上游Failure类型是Never,那么在map之后,Failure类型还是Never。如果上游Failure类型是DecodingError,那么在map之后,Failure类型还是DecodingError

      let up0: AnyPublisher<Int, Never> = ...
      
      let down0: AnyPublisher<String, Never> = up0
      //                              ^^^^^ still Never, like up0
          .map { String($0) }
          .eraseToAnyPublisher()
      
      let up1: AnyPublisher<Int, DecodingError> = ...
      
      let down1: AnyPublisher<String, DecodingError> = up1
      //                              ^^^^^^^^^^^^^ still DecodingError, like up1
          .map { String($0) }
          .eraseToAnyPublisher()
      

      如果闭包抛出错误,tryMap 运算符会以失败完成结束流。 throwing 闭包可以抛出任何Error。错误类型不受限制。所以tryMap总是把Failure类型改成Error

      let up2: AnyPublisher<Int, Never> = ...
      
      let down2: AnyPublisher<String, Error> = up2
      //                              ^^^^^ changed from Never to Error
          .tryMap { String($0) }
          .eraseToAnyPublisher()
      
      let up3: AnyPublisher<Int, DecodingError> = ...
      
      let down3: AnyPublisher<String, Error> = up3
      //                              ^^^^^ changed from DecodingError to Error
          .tryMap { String($0) }
          .eraseToAnyPublisher()
      

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-12
      • 2020-03-06
      • 1970-01-01
      • 1970-01-01
      • 2019-03-01
      • 1970-01-01
      • 2012-10-13
      • 1970-01-01
      相关资源
      最近更新 更多