使用正确的索引反向枚举

Enumerating in reverse with correct indices

Swift 中一个很好的语法是能够像这样将数组的索引和条目枚举为循环:

for (index, entry) in enumerate(myArray) {
    doSomething(index, entry)
}

也可以使用 reverse 条件从数组末尾轻松开始,如下所示:

for (index, entry) in enumerate(reverse(myArray)) {
    doSomething(index, entry)
}

但是,问题在于 index 现在从数组末尾开始计数(即最后一个元素的索引为零),这意味着如果我需要索引值,则必须更正它对于 entrymyArray 中的实际位置,这失去了一些优雅。

另一种方法是这样做:

for (var index, entry) in enumerate(reverse(myArray)) {
    index = (myArray.count - 1) - index
    doSomething(index, entry)
}

这不是世界末日,但我想知道是否有一个我忽略的替代方案可以让我反向枚举,但返回正确的索引值?

当你将 reverse() 应用于一个数组时,结果已经是一个新数组,自然索引应该反映新数组。我找到了另一种反向枚举的方法,我想这已经足够优雅了:

let names = ["Jack", "Lucy", "Kate"]

for index in stride(from: count(names) - 1, through: 0, by: -1) {
    println("\(index): \(names[index])")
}

这可能是一个解决方案:

let myArray = [1, 2, 3, 4]

for index in reverse(0..<myArray.count) {
    println("\(index): \(myArray[index])")
}

编辑:

如果您真的不想通过 for 正文中的索引访问您的条目,您可以尝试:

for (index, entry) in zip(reverse(0..<myArray.count), reverse(myArray)) {
    println("\(index): \(entry)")
}

for (index, entry) in reverse(0..<myArray.count)
    .map({ ([=12=], myArray[[=12=]])}) {

    println("\(index): \(entry)")

}

希望对您有所帮助

不要想的太复杂:

for var i = array.count - 1; i >= 0; i-- {
    let item = array[i]
}