【问题标题】:How to apply .filter operator on individual elements of a CurrentValueSubject that's an array in Swift Combine?如何在 Swift Combine 中的数组 CurrentValueSubject 的各个元素上应用 .filter 运算符?
【发布时间】:2020-09-09 19:52:32
【问题描述】:

我有一个CurrentValueSubject,它是ChatModelFirebase 的数组。我想要做的是删除所有具有“已取消”状态字段的ChatModelFirebase 模型。问题是当我应用 .filter(..) 运算符时,它作用于整个数组而不是单个项目。

var chatFirebaseModels: CurrentValueSubject<[ChatModelFirebase], Never> = CurrentValueSubject([])

chatFirebaseModels
    .filter({ (chatModelFireBaseArray) -> Bool in
        // I want individual array items, not chatModelFireBaseArray
        return false
    })

下面是代码完成的样子:

您可以看到.filter(..) 被应用于[ChatModelFirebase] 数组,而不是单个ChatModelFirebase 模型。

这里的答案是否只使用.flatMap(..)?我很好奇是否有正确的方式使用.filter(...),因此我提出了问题。

【问题讨论】:

  • 这取决于,您是否要将数组和过滤器元素保留在自己的数组中? -> 使用.map { $0.filter { ...} }。想要过滤所有单个元素? -> 使用flatMap { $0 }.filter { ... }
  • 我不确定我是否理解你的问题。目标是删除数组中与某个布尔条件不匹配的一些项目。
  • 我的问题是关于你的映射+过滤的结果。你想以[ChatModelFirebase] 结束(就像你在问题中建议自己使用平面地图)还是[[ChatModelFirebase]] (地图+过滤器)。从某种意义上说,这两种方式都是“正确的”,它们最终实现了相同的效果,但结果类型会有所不同。
  • 哦,我明白了。只想得到一系列模型,即[ChatModelFirebase]

标签: swift swift5 combine


【解决方案1】:

您可以使用.map 来返回过滤后的数组:

chatFirebaseModels
    .map { array in
       array.filter { element in
          // ... filter by element
       }
    }

或者使用纯组合链(虽然看起来不必要地复杂):

chatFirebaseModels
   .flatMap { Publishers.Sequence(sequence: $0) }
   .filter { element in
      // ... filter by element
   }
   .collect()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-25
    • 1970-01-01
    • 1970-01-01
    • 2020-11-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多