Язык Swift часть 10. Как написать цикл?

Когда мы хотим повторить блок какого-то кода множество раз, мы должны использовать циклы в языке программирования. В Swift существует только 3 варианта создания циклов.

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

    while (some_condition) {
        print("Condition is true")
    }
  2. Аналог do whilerepeat while

    repeat {
        // some code here
    } while (some_condition) 
  3. Цикл for in

    for item in items {
        print(item)
    }
    Содержание:


While

Самым простым циклом в языке программирования Swift является while цикл. Его логика проста – до тех пор, пока результат условия возвращает истину true, выполнять код, взятый в круглые скобочки.

Приведем пример: До тех пор, пока бензин в баке автомобиля не закночился (fuel > 0), автомобиль может ехать.

while fuel > 0 {
    car.ride()
    print(fuel)
}

В этом случае, как только переменная fuel примет значение, равное 0, машина остановится. Потому что функция ride() перестанет вызываться.

Что такое функции, как они создаются и работают, мы разберем в следующем уроке. Сейчас просто поймите, что с помощью точки происходит вызов функций конкретного объекта. Например если у нас есть объект собака Dog, который умеет лаять (то есть запусть функцию bark()), мы сможем заставить ее лаять следующим кодом: Dog.bark().

Repeat while

Данный цикл отличается от обычного цикла while тем, что код заключённый в блоке выполнится хотя бы один раз, даже если условие не возвращает true.

var i = 0
repeat {
   i = Int.random(in: 0...10)
   print(i)
} while i =! 10

Этот код будет выводить случайное число в консоль из интервала от 0 до 10, до тех пор, пока полученное число не будет равно 10. Тогда цикл завершится. Но если 10 выпадет в первой же итерации, оно все равно будет выведено в консоль. Таким образом цикл сработает хотя бы один раз.

For in

Цикл for in используется для перебора элементов из каких-либо структур или последовательностей. Например нам нужно вывести на печать все элементы из массива iphones, который содержит в себе наименования моделей телефонов:

let iphones = ["iPhone 1", "iPhone 2G", "iPhone 3GS", "iPhone 4", "iPhone 4S"]
for item in iphones {
   print(item)
}

/* Output:
iPhone 1
iPhone 2G
iPhone 3GS
iPhone 4
iPhone 4S
*/

Так же можно запустить повторение цикла определенное последовательностью количество раз. Например если нужно 3 раза вывести на печать какое-то сообщение, пишем так:

for i in 1...3 {
    print("Hello World!")
}

/* Output:
Hello World!
Hello World!
Hello World!
*/

Вспоминаем, что оператор диапазона ... включает в список как левое число, так и правое. Нам не нужно указывать инкремент или декремент в цикле for. По умолчанию он всегда добавляет +1. Но как тогда быть, если нам нужно вывести элемент в обратном порядке? Ведь 10...1 не сработает. В этом случае приходит на помощь функция reversed(), которой обладают все стандартные типы данных.

let iphones = ["iPhone 1", "iPhone 2G", "iPhone 3GS", "iPhone 4", "iPhone 4S"]

for item in iphones.reversed() {
    print(item)
}

/* Output:
iPhone 4S
iPhone 4
iPhone 3GS
iPhone 2G
iPhone 1
*/

Более сложные условия для цикла for in рассмотрим позднее, когда будем подробно говорить о операторах диапазона значений.

Синтаксис циклов довольно прост. Есть ключевое слово цикла, есть условие, которое может быть взято в скобки, а может и нет. Обязательно тело цикла открывают круглые скобочки, внутри которых пишется основной блок кода.

Для циклов for in используется еще локальная переменная, которой именуются элементы, которые на каждой итерации цикла поступают из выборки данных. for item in () {} для каждого элемента (item) из указанного диапазона, делаем что-то с этим элементом. В теле цикла эту переменную используют для обработки полученных из диапазона элементов.

Мы можем назвать элемент как угодно, тут ограничений нет. Если нам нет необходимости сипользовать конкретный элемент, а например мы выполняем цикл просто какое-то количество раз, то элемент можно не именовать, а написать просто _:

for _ in 0...10 {
    print("0000000000")
}

/*
0000000000
0000000000
0000000000
0000000000
0000000000
0000000000
0000000000
0000000000
0000000000
0000000000
0000000000
*/