【问题标题】:SwiftUI and CombineLatest with more than 4 valuesSwiftUI 和 CombineLatest 超过 4 个值
【发布时间】:2020-08-27 17:29:12
【问题描述】:

我开始尝试使用 SwiftUI,我遇到了一种情况,我想要 5 个滑块的最新组合。我使用CombineLatest4 让所有东西都可以使用 4 个滑块,然后意识到我需要另一个滑块,但没有 CombineLatest5

任何帮助表示赞赏。

澄清工作的 4 滑块版本:

Publishers
    .CombineLatest4($slider1, $slider2, $slider3, $slider4)
    .debounce(for: 0.3, scheduler: DispatchQueue.main)
    .subscribe(subscriber)

【问题讨论】:

    标签: swiftui combine


    【解决方案1】:

    注意 - 从问题中提取的解决方案


    好的,弄清楚语法,@Daniel-t 是对的。我只需要创建子发布者:

    let paramsOne = Publishers
        .CombineLatest3($slider1, $slider2, $slider3)
            
    let paramsTwo = Publishers
        .CombineLatest($slider4, $slider5)
            
    paramsOne.combineLatest(paramsTwo)
        .debounce(for: 0.3, scheduler: DispatchQueue.main)
        .subscribe(subscriber)
    

    请注意,我还必须将订阅者期望的输入从 (Double, Double, Double, Double, Double) 更改为 ((Double, Double, Double), (Double, Double)),并且编译器给了我一个误导性和令人困惑的错误(关于调度程序),直到我发现输入类型是错了。

    【讨论】:

      【解决方案2】:

      你可以使用类似的东西:

      extension Publisher {
      public func combineLatest<P, Q, R, Y>(
          _ publisher1: P,
          _ publisher2: Q,
          _ publisher3: R,
          _ publisher4: Y) ->
          AnyPublisher<(Self.Output, P.Output, Q.Output, R.Output, Y.Output), Self.Failure> where
          P: Publisher,
          Q: Publisher,
          R: Publisher,
          Y: Publisher,
          Self.Failure == P.Failure,
          P.Failure == Q.Failure,
          Q.Failure == R.Failure,
          R.Failure == Y.Failure {
          Publishers.CombineLatest(combineLatest(publisher1, publisher2, publisher3), publisher4).map { tuple, publisher4Value in
              (tuple.0, tuple.1, tuple.2, tuple.3, publisher4Value)
          }.eraseToAnyPublisher()
        }
      }
      

      然后这样称呼它:

      publisher1.combineLatest(publisher2, publisher3, publisher4, publisher5)
      

      【讨论】:

        【解决方案3】:

        CombineLatest2(CombineLatest3, CombineLatest2) 应该可以解决问题,不是吗?

        【讨论】:

        • Hmm... 看起来很合理,但是当我以这种方式嵌套它们时,我得到了Use of unresolved identifier 'CombineLatest'。为了清楚起见,我会将我的“工作”CombineLatest4() 版本添加到问题中。
        • CombineLatestX 看起来有多傻...不能带数组吗?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多