SwiftUI-ForEach是否具有endIndex或lastindex?

时间:2019-10-15 12:22:07

标签: swiftui

我正在使用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"))
    }
}

2 个答案:

答案 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
    }
}