代码之家  ›  专栏  ›  技术社区  ›  Wujo

组合-使用flatMap时错误类型不匹配

  •  0
  • Wujo  · 技术社区  · 3 年前

    我对Combine很陌生。在这种情况下,我面临着编译程序抱怨错误类型不匹配的问题:

    struct Service {
       func save(text: String) -> AnyPublisher<Void, Error> {
          Just(())
            .setFailureType(to: Error.self)
            .eraseToAnyPublisher()
       }
    }
    
    let service = Service()
    let saveTrigger = PassthroughSubject<Void, Never>()
    
    let cancellable = saveTrigger.map { "text to save"}
       .flatMap { service.save(text: $0) }
       .sink {
           print("Saved")
       }
    
    saveTrigger.send(())
    

    生成失败,出现错误: No exact matches in call to instance method 'flatMap'

    如果我使用 setFailureType 这样地:

    let cancellable = saveTrigger.map { "text to save"}
       .setFailureType(to: Error.self)
       .flatMap { service.save(text: $0) }
       .sink {
           print("Saved")
       }
    

    我最终出现了不同的错误: Referencing instance method 'sink(receiveValue:)' on 'Publisher' requires the types 'any Error' and 'Never' be equivalent

    知道如何解决这个问题吗?

    1 回复  |  直到 3 年前
        1
  •  2
  •   Sweeper    3 年前

    sink(receiveValue:) ,只有当发布者 Never 失败。

    可用时间 Failure 从不 .

    您收到的第二条错误消息也暗示了这一点。

    但是,由于您将发布者平面映射到了 save 返回,其中 可以 如果失败,则平面图的最终发布者也可能失败。

    这意味着您需要使用 sink(receiveCompletion:receiveValue:) ,允许您处理错误:

    .sink { completion in
        if case let .failure(error) = completion {
            print("Error occurred: \(error)")
        }
    } receiveValue: { _ in
        print("Saved")
    }