使用 ForEach SwiftUI 迭代多个数组

テッド*_*テッド 3 arrays foreach swift swiftui

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

for (height, label) in zip(heights, labels) {
print("\(height) : \(label)")}
Run Code Online (Sandbox Code Playgroud)

但是,我想知道是否可以使用 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)
                }
Run Code Online (Sandbox Code Playgroud)

但没有喜悦,swiftUI 错误和以往一样神秘......感谢收到任何指示。

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

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

                            Text(label)
                        }
                    }
                }
Run Code Online (Sandbox Code Playgroud)

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

Asp*_*eri 12

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

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

  • 这真是太好了。但是如果我有 3 个数组怎么办?当 zip 仅适用于两个序列时,如何解决这种情况? (3认同)
  • 头号人物!使用 id: \.0 就是当时的技巧。你能解释一下为什么这有效而不是 \.self 吗? (2认同)