Оновлено для Swift 3
Відповідь нижче - це коротка інформація про доступні варіанти. Виберіть той, який найкраще відповідає вашим потребам.
reversed
: числа в діапазоні
Вперед
for index in 0..<5 {
print(index)
}
// 0
// 1
// 2
// 3
// 4
Відсталий
for index in (0..<5).reversed() {
print(index)
}
// 4
// 3
// 2
// 1
// 0
reversed
: елементи в SequenceType
let animals = ["horse", "cow", "camel", "sheep", "goat"]
Вперед
for animal in animals {
print(animal)
}
// horse
// cow
// camel
// sheep
// goat
Відсталий
for animal in animals.reversed() {
print(animal)
}
// goat
// sheep
// camel
// cow
// horse
reversed
: елементи з індексом
Іноді потрібен індекс під час ітерації через колекцію. Для цього ви можете використовувати enumerate()
, який повертає кортеж. Перший елемент кортежу - індекс, а другий - об'єкт.
let animals = ["horse", "cow", "camel", "sheep", "goat"]
Вперед
for (index, animal) in animals.enumerated() {
print("\(index), \(animal)")
}
// 0, horse
// 1, cow
// 2, camel
// 3, sheep
// 4, goat
Відсталий
for (index, animal) in animals.enumerated().reversed() {
print("\(index), \(animal)")
}
// 4, goat
// 3, sheep
// 2, camel
// 1, cow
// 0, horse
Зауважте, що, як зазначив Бен Лахман у своїй відповіді , ви, мабуть, хочете зробити це, .enumerated().reversed()
а не .reversed().enumerated()
(що призвело б до збільшення чисел індексу).
крок: числа
Страйд - це спосіб ітерації без використання дальності. Існує дві форми. У коментарях в кінці коду видно, якою була б версія діапазону (якщо припустити, що приріст дорівнює 1).
startIndex.stride(to: endIndex, by: incrementSize) // startIndex..<endIndex
startIndex.stride(through: endIndex, by: incrementSize) // startIndex...endIndex
Вперед
for index in stride(from: 0, to: 5, by: 1) {
print(index)
}
// 0
// 1
// 2
// 3
// 4
Відсталий
Зміна розміру приросту -1
дозволяє вам рухатися назад.
for index in stride(from: 4, through: 0, by: -1) {
print(index)
}
// 4
// 3
// 2
// 1
// 0
Зауважте to
і through
різницю.
крок: елементи SequenceType
Вперед з кроком 2
let animals = ["horse", "cow", "camel", "sheep", "goat"]
Я використовую 2
в цьому прикладі просто для того, щоб показати іншу можливість.
for index in stride(from: 0, to: 5, by: 2) {
print("\(index), \(animals[index])")
}
// 0, horse
// 2, camel
// 4, goat
Відсталий
for index in stride(from: 4, through: 0, by: -1) {
print("\(index), \(animals[index])")
}
// 4, goat
// 3, sheep
// 2, camel
// 1, cow
// 0, horse
Примітки
@matt має цікаве рішення, де він визначає власного оператора зворотного зв'язку та називає його >>>
. Для визначення не потрібно багато коду і використовується так:
for index in 5>>>0 {
print(index)
}
// 4
// 3
// 2
// 1
// 0
Ознайомтесь із стилем C для циклів, знятих із Swift 3