Основи Swift. Цикли

Коли справа доходить до повторення однотипних завдань в коді, «скопіювати і вставити» — найшвидше рішення. Але набагато ефективніше буде застосувати цикли, прості програмні конструкції, які повторюють блок коду до тих пір, поки умова залишається істинною (значення «true»).

Щоб зрозуміти, як це працює, давайте познайомимося зі спеціальною налагоджувальною функцією println(). У поточній версії Swift 2.2 вона була перейменована в print(), але її функціонал залишився колишнім — відображення на екрані значення, переданого в тіло функції у вигляді параметра. У playground вона роздрукує підсумкове значення в області результатів, у середовищі розробки Xcode — в області налагодження. У будь-якому випадку, функція print() є чудовим механізмом для ознайомлення з вмістом наших змінних і констант:

print("1 x 10 is \(1 * 10)")
print("2 x 10 is \(2 * 10)")
print("3 x 10 is \(3 * 10)")
print("4 x 10 is \(4 * 10)")
print("5 x 10 is \(5 * 10)")
print("6 x 10 is \(6 * 10)")
print("7 x 10 is \(7 * 10)")
print("8 x 10 is \(8 * 10)")
print("9 x 10 is \(9 * 10)")
print("10 x 10 is \(10 * 10)")

В області результатів відобразиться 10 рядків із результатами обчислень. Як ви самі можете переконатися, це не найефективніший код. Існує набагато більш привабливий спосіб вирішити наше завдання: застосувати цикл до діапазону чисел від 1 до 10, використавши оператор замкнутого циклу:

for i in 1...10 {
    print("\(i) x 10 is \(i * 10)")
}

В області результатів відобразиться «(10 times)». Це означає, що наш цикл виконався рівно 10 разів. Щоб побачити результати обчислень кожної з 10 ітерацій, необхідно виділити курсором «(10 times)» і натиснути кнопку «+» праворуч від виділення:

Цикл виконався 10 разів

Для створення циклу без використання індексу кількості повторів застосовується синтаксична конструкція, у якій замість індексу вказується символ підкреслення «_»:

var str = "Fakers gonna"
for _ in 1...5 {
    str += " fake"
}
print(str)

Такий код надрукує «Fakers gonna fake fake fake fake fake».

Існує ще один варіант оператора закритого циклу під назвою оператор напіввідкритого діапазону. У ньому замість символу «...» використовується інший символ «..<». При його використанні блок коду всередині нашого циклу повториться 4 рази.

Обробка масивів

Swift має один дуже простий метод перебирання усіх елементів у масиві. Оскільки Swift знає, дані якого типу зберігаються в масиві, він може діставати кожен елемент масиву, присвоювати його значення іменованій константі і запускати блок внутрішнього коду. Наприклад, давайте роздрукуємо список відомих пісень, використовуючи цей метод:

var songs = ["Shake it Off", "You Belong with Me", "Back to December"]
 
for song in songs {
    print("My favorite song is \(song)")
}</p>

Також ми можемо використовувати конструкцію циклу for-in для перебирання масивів, наприклад, один індекс для двох масивів:

var people = ["players", "haters", "heart–breakers", "fakers"]
var actions = ["play", "hate", "break", "fake"]
 
for i in 0 ... 3 {
    print("\(people[i]) gonna \(actions[i])")
}

Важливо: оскільки відлік позиції елемента в масиві ведеться від нуля, рекомендується в операторі порівняння з максимально можливим індексом масиву застосовувати оператор напіввідкритого діапазону. Він дозволяє використовувати метод виключення в циклах.

Також програмісти часто використовують цикл for-in для ітерації по словнику з метою отримати доступ до його пари ключ-значення (кортеж). Більше про кортежі читайте у статті про умовні оператори у Swift.

let numberOfLegs = ["spider" : 8, "ant" : 6, "cat" : 4]
 
for (animalName, legCount) in numberOfLegs {
    print("\(animalName)s have \(legCount) legs")
}</p>

Для підрахунку кількості елементів в масиві застосовується функція count(someArray) для Swift 1.2 і someArray.count для Swift 2:

var people = ["players", "haters", "heart–breakers", "fakers"]
var actions = ["play", "hate", "break", "fake"]
for i in 0..<people.count {
    print("\(people[i]) gonna \(actions[i])")
}

Внутрішні цикли

У мові Swift допускається вкладення циклів. Давайте об’єднаємо два наших попередніх цикли, щоб навчитися створювати внутрішні цикли:

var people = ["players", "haters", "heart–breakers", "fakers"]
var actions = ["play", "hate", "break", «fake"]
 
for i in 0..<people.count {
    var str = "\(people[i]) gonna"
    for _ in 1...5 {
        str += " \(actions[i])"
    }
    print(str)
}

В області результатів playground спочатку відобразиться «players gonna play play play play play», потім «haters gonna...» — я думаю, основна ідея тут зрозуміла.

Важливо: серед програмістів прийнято привласнювати абстрактні імена індексам циклу, наприклад, найбільш ходовими є i та j. Однак, вважається хорошим тоном давати індексами осмислені назви, наприклад, наступний код є цілком допустимим:

for personNumber in 0..<people.count

Цикли while

Існує третій вид циклу, який повторює блок коду до тих пір, поки ми не накажемо йому зупинитися. Він використовується, наприклад, для організації закінчення гри, в якій неможливо заздалегідь передбачити, як довго вона триватиме. Ми просто продовжуємо перевіряти умову до тих пір, поки гравець не натисне кнопку, щоб вийти з гри і повернутися в головне меню.

Такі цикли називаються циклами while і виглядають наступним чином:

var counter = 0
while true {
    print("Counter is now \(counter)")
    counter += 1
    if counter == 556 {
        break
    }
}

Примітка: у новій версії Swift 3.0 відбудеться заміна префіксного і постфіксного операторів «++» на оператор «+=»!

Цикли в Swift

Зверніть увагу на нову службову команду break. Вона використовується для виходу із циклів while і for в точці, заданій розробником. Без неї вищенаведений код не буде мати кінця, оскільки умова для перевірки завжди повертає значення «істина» (true). Без команди break оператор циклу буде виконуватися нескінченно, що в свою чергу є причиною помилки програми.

Цикли while краще всього застосовувати для обробки невідомих даних, наприклад, при завантаженні даних з Інтернету, читання з файлу формату XML, обробки введених користувачем значень і таке інше. Це пояснюється тим, що тільки програміст знає, коли і за яких умов потрібно перервати виконання повторів у циклі.

У Swift присутня також і команда-аналог під назвою continue. Ця команда припиняє виконання поточної ітерації, переводячи виконання коду на наступний крок у циклі.

Swift пропонує два види циклів while:

  1. while — умова виконання обчислюється на початку кожної ітерації циклу.
  2. repeate-while — умова виконання обчислюється в кінці кожної ітерації циклу.

Swift 3.0

У новій редакції Swift 3.0 стандартна конструкція циклу, до якої ми звикли у Objective-C і поточній версії Swift 2.2, втратить свою актуальність:

for var i = 1; i <= 10; i += 1 {
    print(i)
}

Замість неї набувають більш поширеного застосування діапазони (зворотній та прямий):

for i in (1...10).reverse() {
    print(i)
}

Сьогодні ми дізналися про цикли різних видів (while, із закритим і напіввідкритим діапазоном), їх вкладення і деякі зміни, представлені в Swift 3.0, які стосуються циклів.

Джерело: Hacking with Swift

Читати ще: Основи Swift. Оператори передачі управління switch case

Потрібен MVP, розробка під iOS, Android або прототип додатка? Ознайомтеся з нашим портфоліо і зробіть замовлення вже сьогодні!

Об авторе

iOS разработчик
Сергей внимательно следит за новостями Apple для разработчиков, любит делится знаниями и преподает на курсах по Swift.

Похожие статьи

Вернуться к списку записей К списку записей