我正在使用ForEach创建循环。但是,我想根据循环的数量有条件地渲染Rectangle。例如,如果最后一次循环迭代,则不要渲染矩形。
正确的语法是什么?
我正在寻找类似的东西(无效的伪代码)
ForEach(arrayOfThings, id: \.title) { thing in
// Stuff that happens on every iteration of loop
// Conditional section
if (thing.endIndex-1) {
Rectangle()
.frame(width: 100, height: 1, alignment: .bottom)
.foregroundColor(Color("666666"))
}
}
我知道有些for (offset, element) in array.enumerated() { }
之类的东西,但是您不能在视图中使用它们。我想知道ForEach中是否有便利功能来解决此需求?
目前,我正在这样做以解决此问题:
ForEach(0..<arrayOfThings.count) { i in
// Stuff that happens on every iteration of loop
// Conditional section
if (i = self.arrayOfThings.count-1) {
Rectangle()
.frame(width: 100, height: 1, alignment: .bottom)
.foregroundColor(Color("666666"))
}
}
答案 0 :(得分:2)
如果您的arrayOfThings是可等的,您可以这样做
ForEach(arrayOfThings, id: \.title) { thing in
if thing == arrayOfThings.last {
// do something
}
}
在我看来,这比检查索引与计数更具可读性。
答案 1 :(得分:0)
要知道它是否是最后一个元素,您可以测试用作 id 的 KeyPath
对于最后一个元素和当前元素是否相同。
请注意,id
参数确保是唯一的(在运行时)和 Equatable
。因此,您不会遇到关于重复元素或缺少相等性的任何问题,就像您可以直接使用该元素一样,即使它没有用作 id
。
ForEach(myArray, id: \.someProperty) { element in
if element.someProperty == myArray.last.someProperty {
// do something with the last element
}
}
或者如果您直接使用 Identifiable
元素或使用 id: \.self
:
ForEach(myArray) { element in
if element == myArray.last {
// do something with the last element
}
}