SwiftUI - ForEach 是否有 endIndex 或 lastindex?

Ben*_*ain 6 swift 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"))
    }
}
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)

在我看来,这比检查索引与计数更具可读性。

  • 如果最后一个元素在数组中间有重复项(例如 [1,2,3,4,5,3] - 数组中的第三个和最后一个元素将导致“if”执行),这也不起作用,而不仅仅是最后一个。您必须确保每个元素都是真正唯一的,这样才能可靠。 (2认同)

Dan*_*iel 6

要知道它是否是最后一个元素,您只需测试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)