Циклы являются фундаментальной концепцией программирования. Вы можете повторить свой код с помощью цикла и сделать его более выразительным. В Swift для циклов мы можем использовать операторы for-in, while, repeat-while.
Использование цикла for
Синтаксис циклов в Swift достаточно прост:
for item in items { // Выполнить часть кода }
Для цикла в Swift всегда используются ключевые слова for и in. Затем цикл for берет последовательность, как items в примере выше, и циклически проходит по каждому ее элементу. Каждый элемент последовательности доступен как константа item. Код, который повторяется, находится в скобках { }.
Вы можете прочитать приведенный выше пример кода как: Для каждого «элемента» в «последовательности» выполните следующий код.
Давайте посмотрим на пример:
for n in 1...5 { print(n) } // 1 2 3 4 5
В приведенном выше примере оператор используется закрытого диапазона для создания диапазона от 1 до 5, включая 5. Таким образом, вы можете повторять определенную функцию, например print(), ограниченное количество раз.
Использование цикла for-in с последовательностями
Мы уже рассматривали пример с оператором закрытого диапазона:
for n in 1...5 { print(n) } // 1 2 3 4 5
Закрытая последовательность принимает два параметра: нижнюю границу (первое число) и верхнюю границу (последнее число). Затем создается диапазон между этими двумя числами, включая последнее.
Также мы можем создать полузакрытую последовательность с оператором полузакрытого диапазона, который создает диапазон между верхней и нижней границами, но без учета верхней границы.
for i in 0..<5 { print(i) } // 0 1 2 3 4
Оператор диапазона полезен, когда вы имеете дело с массивами. Индекс последнего элемента массива всегда равен размеру массива минус один.
Вы можете использовать следующий код:
for i in 0..<items.count { // }
Или же равнозначный код:
for i in 0...items.count - 1 { // }
Использование цикла for-in с массивами
let names = ["Arthur", "Zaphod", "Trillian", "Ford", "Marvin"] for name in names { print(name) } // Arthur // Zaphod // Trillian // Ford // Marvin
Еще один пример:
let numbers = [1, 2, 3, 4, 5, 6] var sum = 0 for i in numbers { sum += i } print(sum) // 21
Что если мы хотим создать функцию, которая возвращает сумму любого массива целых чисел?
func sum(_ numbers: [Int]) -> Int { var sum = 0 for n in numbers { sum += n } return sum } let result = sum([23, 11, 9, 3, 24, 77]) print(result) // 147
Вы также можете использовать индекс массива для ссылки на определенный элемент.
for i in 0..<numbers.count { sum += numbers[i] }
Для массива из 6 элементов мы выполняем итерацию от индекса 0 индексу 5 от начала до конца массива. Внутри цикла for мы используем синтаксис индекса, чтобы получить целое число из массива с помощью конструкции numbers[i].
Что если вы хотите получить доступ к индексу каждого элемента в массиве? Для данного случая у нас есть полезная функция enumerated().
let primes = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31] for (n, prime) in primes.enumerated() { print("\(n) = \(prime)") } // 0 = 2 // 1 = 3 // 2 = 5 // 3 = 7 // 4 = 11 // 5 = 13 // 6 = 17 // 7 = 19 // 8 = 23 // 9 = 29 // 10 = 31
В приведенном выше коде мы определили массив целых чисел primes. В цикле for мы деконструируем индекс и значение элемента массива в кортеж (n, prime) c помощью функции enumerated().
Использование цикла for-in со словарями
Каким образом мы можем перебрать значения словаря?
let scores = ["Александр": 42, "Витя": 99, "Женя": 13] for (name, score) in scores { print("\(name) набрал \(score) очков") } // Александр набрал 13 очков // Витя набрал 42 очков // Женя набрал 99 очков
В приведенном выше коде мы создали словарь scores с именами и количествов очков. Тип словаря [String: Int]. В цикле мы используем кортеж для получения пары ключ-значение. name соответствует ключу словаря, а score соответствует значению.
Использование циклов в практической разработке
В практической разработке приложений циклы могут полезны в следующих сценариях.
Если вы хотите применить один и тот же стиль к нескольким элементам одного типа, например, к кнопкам. Вы просто помещаете кнопки в массив, затем перебираете их с помощью цикла for и устанавливаете стили для каждой отдельной кнопки.
let buttons = [loginButton, signupButton, facebookButton] for button in buttons { button.backgroundColor = UIColor.red button.layer.cornerRadius = 5.0 }
Вы можете перебрать массив чисел, например, для построения линейного графика.
let points = [0.1, 0.2, 0.3, 0.5, 0.7, 0.8] for x in 0..<points.count { let y = points[x] graph.drawPoint(x, y) }
Если вы хотите отправить уведомление каждому пользователю, например, в приложении для социальных сетей, вы можете использовать цикл for следующим образом:
for uid in user.followers { sendNotification(withUID: uid) }
Цикл while
Цикл while повторяет код до тех пор, пока условие не становится false. Это полезно, когда вы хотите что-то повторить, но не знаете, какое количество раз. Условие всегда оценивается в начале цикла.
while(condition == true) { // Повторить следующий код }
Цикл repeat-while
Цикл repeat-while похож на while за исключением того, что он оценивает условие в конце цикла. Поэтому данный цикл всегда выполняет хотя бы одну итерацию.
repeat { // Повторить следующий код } while(condition == true)