我正在使用 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"))
}
}
Run Code Online (Sandbox Code Playgroud)
我知道有一些类似的东西,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"))
}
}
Run Code Online (Sandbox Code Playgroud)
Cas*_*gen 14
如果您的 arrayOfThings 是 Equatable,您可以这样做
ForEach(arrayOfThings, id: \.title) { thing in
if thing == arrayOfThings.last {
// do something
}
}
Run Code Online (Sandbox Code Playgroud)
在我看来,这比检查索引与计数更具可读性。
要知道它是否是最后一个元素,您只需测试KeyPath最后一个元素和当前元素的用作 id 是否相同即可。
请注意,id确保参数是唯一的(在运行时)并且Equatable. 因此,您不会遇到任何有关重复元素或缺少相等性的问题,就像直接使用该元素一样,即使它不用作id.
ForEach(myArray, id: \.someProperty) { element in
if element.someProperty == myArray.last?.someProperty {
// do something with the last element
}
}
Run Code Online (Sandbox Code Playgroud)
或者如果您Identifiable直接使用元素或使用id: \.self:
ForEach(myArray) { element in
if element == myArray.last {
// do something with the last element
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2055 次 |
| 最近记录: |