【问题标题】:Merge two Combine Arrays into a Single Array将两个组合数组合并为一个数组
【发布时间】:2021-07-16 20:12:14
【问题描述】:

我有两种类型

let left: Future<[Int]>
let right: Future<[Int]>

如何将这些组合起来,以便拥有一个连续的一维数组?

使用appendmerge 创建二维数组并没有明确的信息。确实是收集 2D 数组然后在 flatMap 中使用 flatMap 的最佳方法,例如:

.collect().flatMap { arrays in arrays.flatMap { $0 } }

必须有更好的方法。

【问题讨论】:

  • 这里的“组合数组”是什么意思?如果您有从left 发出的[1,4][2,3,5] - 从right,应该发生什么?您是要等到拥有两个值并合并到 [1,4,2,3,5] 中,还是要一个接一个地发出值?
  • @NewDev 回答您的问题 - 这些是未来,因此数组作为单个对象出现,而不是单独作为流。左/右或右/左的顺序对我来说并不重要:)
  • @NewDev 到您的示例,这将是完美的,但只是作为单个数组发出 [1,4,2,3,5]。 (我的示例代码会按照您的建议产生输出,我只是认为可能有更好的方法)

标签: arrays swift combine flatmap


【解决方案1】:

如果您有两个发布者发出您想以某种方式组合的值,您通常有两种您可能想要的行为:(1) zip - 等待每个发布者发出,或 (2) combineLatest -任何人发出值时立即发出。

所以,在你的情况下,它可能是zip

left.zip(right)
    .map { (l, r) in l + r)
    .sink { ... }

combineLatest

left.combineLatest(right)
    .map { (l, r) in l + r)
    .sink { ... }

如果leftright 都发出一个值(例如,像Future 那样),它们的行为是相同的。因此,如果left 发出[1,4]right 发出[2,3,5],则输出将为[1,4,2,3,5]

区别在于之后会发生什么。

对于zip,当left 发出下一个值,比如[11,44],直到right 发出一个值,比如[22,33,55],才会有输出,然后输出将是:[11,44,22,33,55] .

使用combineLatest,一旦left 发出,输出将是[11,44,2,3,5],然后当right 发出时,输出将是[11,44,22,33,55]

【讨论】:

  • zip + map 是我一直在寻找的,主要是 map 函数是我使用 flatMap 的关键,然后是 Just 这不是很好。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-19
  • 2012-05-10
  • 2018-04-27
  • 2017-03-22
  • 1970-01-01
相关资源
最近更新 更多