Потік керування
Щоб створювати умовні переходи, слід використовувати 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)
Щоб створити діапазон, що не включає верхнє значення, використовуйте оператор ..<
. Якщо потрібно створити діапазон, що включає верхнє та нажнє значення – використовуйте оператор ...
.