Link Search Menu Expand Document

Потік керування

Щоб створювати умовні переходи, слід використовувати if та switch. Щоб створювати цикли, слід використовувати for-in, for, while, та repeat-while. Круглі дужки довкола виразу в умовах та циклах необов’язкові. Фігурні дужки довкола тіла обов’язкові.

let individualScores = [75, 43, 103, 87, 12]
var teamScore = 0
for score in individualScores {
    if score > 50 {
        teamScore += 3
    } else {
        teamScore += 1
    }
}
print(teamScore)

Умова у конструкції if повинна бути Булевим виразом — тобто код на кшталт if score { ... } є помилкою, а не неявним порівнянням з нулем.

Ви можете використовувати if та let разом щоб працювати з опціональними значеннями, або опціоналами. Опціонал моделює значення, що може бути відсутнім. Опціонал або містить значення, або nil, щоб означає відсутність значення. Щоб зробити значення опціональним, напишіть після його типу знак питання (?).

var optionalString: String? = "Вітаю"
print(optionalString == nil)

var optionalName: String? = "Степан Яблучко"
var greeting = "Вітаю!"
if let name = optionalName {
    greeting = "Вітаю, \(name)"
}

Експеримент

Присвойте optionalName значення nil. Яке вітання ви отримуєте? Додайте секцію else, котра задає інше вітання, якщо optionalName є nil.

Якщо значення опціоналу nil, то умова вважається хибною (false) і код у фігурних дужках пропускається. В іншому випадку значення опціоналу розгортається і присвоюється константі після let, що робить розгорнуте значення доступним всередині блоку коду.

Іншим способом працювати з опціоналами є надання значення за замовчанням за допомогою оператору ??. Якщо значення опціоналу відсутнє, замість нього використовується значення за замовчанням.

let nickName: String? = nil
let fullName: String = "Степан Яблучко"
let informalGreeting = "Вітаю \(nickName ?? fullName)"

Інструкції switch підтримують будь-який тип даних і широке різноманіття операцій порівняння — вони не обмежені цілими числами та перевірками на рівність.

let vegetable = "червоний перець"
switch vegetable {
case "помідор":
    print("З нього можна зробити кетчуп.")
case "огірок", "редис":
    print("З них можна зробити бутерброд до чаю.")
case let x where x.hasSuffix("перець"):
    print("Це гострий \(x)?")
default:
    print("Все смакує гарно в супі.")
}

Експеримент

Спробуйте прибрати випадок за замовчанням. Яку помилку ви отримаєте?

Зверніть увагу, як let може використовуватись у шаблоні для того, щоб присвоїти константі значення, котре відповідає шаблону.

Після виконання коду всередині випадку case, що підійшов, програма виходить з інструкції switch. Виконання не переходить до наступного випадку case, тому нема потреби явно виходити із інструкції за допомогою оператору break в кінці кожного випадку.

Щоб перебирати елементи в асоціативному масиві, використовуйте цикл for-in, надаючи пару імен для кожної пари ключ-значення. Асоціативні масиви є невпорядкованою колекцією, тому їх ключі і значення перебираються у довільному порядку.

let interestingNumbers = [
    "Прості": [2, 3, 5, 7, 11, 13],
    "Фібоначчі": [1, 1, 2, 3, 5, 8],
    "Квадрати": [1, 4, 9, 16, 25],
]
var largest = 0
for (kind, numbers) in interestingNumbers {
    for number in numbers {
        if number > largest {
            largest = number
        }
    }
}
print(largest)

Експеримент

Додайте іншу змінну, щоб знайти, котрий різновид чисел містить найбільше число, і що це за число.

Щоб повторювати блок коду допоки значення умови не зміниться на false, використовуйте цикл while. Якщо потрібно, щоб цикл виконався хоча б один раз, умову циклу слід вказати наприкінці циклу.

var n = 2
while n < 100 {
    n = n * 2
}
print(n)

var m = 2
repeat {
    m = m * 2
} while m < 100
print(m)

Ви можете тримати індекс в циклі, використовуючи оператор ..< для створення діапазону індексів.

var total = 0
for i in 0..<4 {
    total += i
}
print(total)

Щоб створити діапазон, що не включає верхнє значення, використовуйте оператор ..<. Якщо потрібно створити діапазон, що включає верхнє та нажнє значення – використовуйте оператор ....