SwiftUI - ForEach 与 Stride
SwiftUI - ForEach with Stride
我正在尝试创建 Hstack'd 卡片列表,也就是说,我想创建一系列行的滚动视图。每行将包含并排显示的两个视图的 HStack,并由一些列表数据结构初始化。
struct MyHStackView: View {
var myArray = [SomeStruct(1), SomeStruct(3), SomeStruct(4), SomeStruct(5), SomeStruct(6)]
var body: some View {
ScrollView(.vertical) {
VStack {
ForEach(0..<self.myArray.count) { index in
HStack {
SubView(myArray[index])
SubView(myArray[index+1])
}
}
}
}
唯一的问题是我当前的实现涉及数组的每个元素,新的 ForEach 中是否内置了一个 stride
函数,以便我可以对数组中的每个其他元素进行索引以初始化该行?你会如何处理这个问题?
如果只是隔一个,可以试试
VStack {
ForEach(0 ..< self.myArray.count/2) { index in
HStack {
SubView(myArray[index * 2])
SubView(myArray[index * 2 + 1])
}
否则,您可能需要使用stride
函数:
ForEach( Array(stride(from: 0, to: self.myArray.count, by: 2)), id: \.self) { index in
对于简单的用例,E. Coms 发布的解决方案可能有效。如果您计划修改或重新排序列表,可能会给您带来麻烦,因为指定的 id 与索引相同,并且列表将无法正确设置动画 removals/additions/re-ordering.
我会创建一个数据结构来以可识别的方式表示元组:
struct SomeStructTouple: Identifiable {
let a: SomeStruct
let b: SomeStruct
var id: String {
"\(a.id)-\(b.id)"
}
}
然后创建一个元组数组来生成列表。
我正在尝试创建 Hstack'd 卡片列表,也就是说,我想创建一系列行的滚动视图。每行将包含并排显示的两个视图的 HStack,并由一些列表数据结构初始化。
struct MyHStackView: View {
var myArray = [SomeStruct(1), SomeStruct(3), SomeStruct(4), SomeStruct(5), SomeStruct(6)]
var body: some View {
ScrollView(.vertical) {
VStack {
ForEach(0..<self.myArray.count) { index in
HStack {
SubView(myArray[index])
SubView(myArray[index+1])
}
}
}
}
唯一的问题是我当前的实现涉及数组的每个元素,新的 ForEach 中是否内置了一个 stride
函数,以便我可以对数组中的每个其他元素进行索引以初始化该行?你会如何处理这个问题?
如果只是隔一个,可以试试
VStack {
ForEach(0 ..< self.myArray.count/2) { index in
HStack {
SubView(myArray[index * 2])
SubView(myArray[index * 2 + 1])
}
否则,您可能需要使用stride
函数:
ForEach( Array(stride(from: 0, to: self.myArray.count, by: 2)), id: \.self) { index in
对于简单的用例,E. Coms 发布的解决方案可能有效。如果您计划修改或重新排序列表,可能会给您带来麻烦,因为指定的 id 与索引相同,并且列表将无法正确设置动画 removals/additions/re-ordering.
我会创建一个数据结构来以可识别的方式表示元组:
struct SomeStructTouple: Identifiable {
let a: SomeStruct
let b: SomeStruct
var id: String {
"\(a.id)-\(b.id)"
}
}
然后创建一个元组数组来生成列表。