Подтвердить что ты не робот

Индекс декремента в цикле после циклов Swift C-стиля не рекомендуется

Как бы вы выразили декрементированный индексированный цикл в Swift 3.0, где синтаксис ниже уже недействителен?

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

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

Ответ 1

Вот более простой (и более 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

Циклы 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, см. этот ответ.

Ответ 3

От swift 3.0, метод stride(to:by:) на Strideable был заменен на свободную функцию stride(from:to:by:)

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

Ответ 4

Вы можете использовать метод stride:

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

или классический цикл while.

Ответ 5

Если вы все еще хотите использовать этот цикл 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)
}