46

How would you express a decrementing indexed loop in Swift 3.0, where the syntax below is not valid any more?

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

// 10 9 8 7 6 5 4 3 2 1
jscs
  • 63,694
  • 13
  • 151
  • 195
netshark1000
  • 7,245
  • 9
  • 59
  • 116

5 Answers5

61

Here is an easier (and more Swifty) approach.

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
Jonny
  • 1,969
  • 18
  • 25
50

C-style loops with a fixed increment or decrement can be replaced by stride():

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

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

Use stride(to: ...) or stride(through: ...) depending on whether the last element should be included or not.

This is for Swift 2. The syntax changed (again) for Swift 3, see this answer.

Community
  • 1
  • 1
Martin R
  • 529,903
  • 94
  • 1,240
  • 1,382
32

From swift 3.0, The stride(to:by:) method on Strideable has been replaced with a free function, stride(from:to:by:)

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

// You can also use stride condition like
// {Some Value}.stride(to: 0, by: -1)
// for index in 10.stride(to: 0, by: -1) { }
Bhavin Bhadani
  • 22,224
  • 10
  • 78
  • 108
10

You can use stride method:

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

or classic while loop.

Sebastian Osiński
  • 2,894
  • 3
  • 22
  • 34
1

If you still want to use this C-style loop, here is what you need:

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)
}
ielyamani
  • 17,807
  • 10
  • 55
  • 90