在弃用Swift C风格循环后,在循环中减少索引

时间:2016-01-27 08:30:23

标签: swift for-loop decrement

你如何在Swift 3.0中表达一个递减的索引循环,其中下面的语法不再有效?

for var index = 10 ; index > 0; index-=1{
   print(index)
}

// 10 9 8 7 6 5 4 3 2 1

5 个答案:

答案 0 :(得分:48)

可以替换具有固定增量或减量的C风格循环 stride()

for index in 10.stride(to: 0, by: -1) {
    print(index)
}

// 10 9 8 7 6 5 4 3 2 1

使用stride(to: ...)stride(through: ...)取决于是否 应该包括或不包括最后一个元素。

这是针对Swift 2. Swift 3的语法改变了(再次),请参阅 this answer

答案 1 :(得分:44)

这是一种更简单(也更Swifty)的方法。

for i in (0 ..< 5).reversed() {
    print(i) // 4,3,2,1,0
}

let array = ["a", "b", "c", "d", "e"]
for element in array.reversed() {
    print(element) // e,d,c,b,a
}

array.reversed().forEach { print($0) } // e,d,c,b,a

print(Array(array.reversed())) // e,d,c,b,a

答案 2 :(得分:21)

swift 3.0开始,Strideable上的stride(to:by:)方法已替换为免费功能stride(from:to:by:)

 for index in stride(from: 10, to: 0, by: -1){
      print(index)
 }

答案 3 :(得分:10)

您可以使用stride方法:

10.stride(through: 0, by: -1).forEach { print($0) }

或经典的while循环。

答案 4 :(得分:1)

如果你仍想使用这个C风格的循环,这就是你需要的:

let x = 10

infix operator ..> { associativity left }
func ..>(left: Int, right: Int) -> StrideTo<Int> {
    return stride(from: left, to: right, by: -1)
}

for i in x..>0 {
    print(i)
}