【问题标题】:Iterating over multiple arrays with ForEach SwiftUI使用 ForEach SwiftUI 遍历多个数组
【发布时间】:2020-05-19 10:39:08
【问题描述】:

swiftUI 中的 ForEach 结构对于遍历数组以创建视图非常有用,但我想知道是否有一种方法可以同时遍历多个数组。我知道,如果您在使用 for in 循环时使用 zip,您可以像这样实现:

for (height, label) in zip(heights, labels) {
print("\(height) : \(label)")}

但是,我想知道是否可以使用 ForEach 来做到这一点。我已经尝试过了,但我似乎无法做到正确。我发现迭代两个数组的唯一方法是使用索引为每个数组下标,但这似乎不够迅速。

到目前为止我尝试过的是:


let heights:[CGFloat] = [20, 40, 100, 5, 70, 80, 30]
let labels = ["mon", "tue", "wed", "thu", "fri", "sat", "sun", ]

ForEach(zip(heights, labels), id: \.self) { (height, label) in
                    Text("\(height)")
                    Text(label)
                }

但是没有乐趣,swiftUI 错误和以往一样神秘...... 任何指点都感激不尽。

编辑: 我发现让它工作的一种方法是做一个嵌套的 ForEach,比如:

ForEach(self.heights, id: \.self) { height in
                    Group {
                        Text("\(height)")
                        ForEach(self.labels, id: \.self) { label in

                            Text(label)
                        }
                    }
                }

但同样,它似乎不是很迅速。

【问题讨论】:

  • 您从 SwiftUI 得到的错误是什么?
  • 完全不合时宜。它的意思是:无法推断通用参数“背景”。我知道这与实际问题无关,编译器错误只是用 swiftUI 敲击 atm。

标签: arrays swift foreach swiftui


【解决方案1】:

这是可能的方法(经过测试并使用 Xcode 11.3.1)

ForEach(Array(zip(heights, labels)), id: \.0) { item in
    VStack {
        Text("\(item.0)")
        Text(item.1)
    }
}

【讨论】:

  • 顶级人物!使用 id: \.0 是当时的诀窍。你能解释为什么这行得通而不是 \.self 吗?
  • id 这里应该是Hashable 属性的键路径,但在这种情况下\.self 是元组,而\.0 是CGFloat。 \.1 也可以使用。无论如何,你必须提供一些 Hashable 的东西。
  • 有道理!感谢您花时间回答我的问题。
  • 这真是太好了。但是如果我有 3 个数组呢?当 zip 仅适用于两个序列时,如何解决这种情况?
  • @ShawkathSrijon 有点晚了,但是你可以做zip(a, zip(b, c)) 或者像gist.github.com/tailec/bf37d064df79e5121def6fafbf1148b1 这样的github项目如果你不喜欢多个嵌套拉链的手动解决方案,你总是可以用一张地图。这将消除嵌套元组:zip(a, zip(b, c)).map { ($0, $1.0, $1.1) }
猜你喜欢
  • 2019-11-02
  • 2014-07-31
  • 2017-03-22
  • 1970-01-01
  • 2012-07-17
  • 2013-03-26
  • 2022-12-18
  • 1970-01-01
  • 2016-04-06
相关资源
最近更新 更多