if и else
Чему вы научитесь:
- выбирать, какой код выполнить, с помощью
if,else ifиelse; - объяснять, почему условием в Swift может быть только
Bool; - раскладывать значение по веткам
switch: по списку, по диапазону или по условиюwhere; - объяснять, почему ветка
switchне проваливается в следующую и зачем нуженdefault.

Представьте развилку дороги с указателем: «Если идёт дождь — налево, к остановке. Иначе — направо, через парк». Вы читаете условие и выбираете одну дорогу, а по другой в этот раз не идёте.
До сих пор программа выполняла все строки подряд, сверху вниз. Но часто ей нужна такая же развилка: напечатать одно или другое, посчитать так или иначе. Для этого есть инструкция if. Она выполняет блок в фигурных скобках, только если условие истинно, а блок после else — когда оно ложно:
let correct = 17
let total = 20
let percent = correct * 100 / total
if percent >= 90 {
print("excellent")
} else if percent >= 60 {
print("pass") // pass
} else {
print("fail")
}Давайте пройдём по программе:
percentполучает17 * 100 / 20, то есть85.if percent >= 90— условие ложно, и программа пропускает первую ветку.else if percent >= 60— условие истинно, и программа печатаетpass.- Ветку
elseпрограмма пропускает: подходящая ветка уже нашлась.
Процент здесь вычисляется из двух чисел, а не записан готовым. Если написать let percent = 85, компилятор ещё при проверке файла заметит, что при таком значении две ветки никогда не выполнятся, и выдаст предупреждение will never be executed. Программа всё равно соберётся и напечатает pass: это предупреждение, а не ошибка.
Три вида веток
Каждый блок в фигурных скобках после if, else if или else называют веткой.
if
Ветка if открывает развилку. Её запись состоит из трёх частей:
- ключевое слово
if; - условие, например
percent >= 90; - блок в фигурных скобках, который выполняется, когда условие истинно.
if может стоять и один, без else. Тогда при ложном условии программа пропускает блок и идёт дальше.
else if
Ветка else if добавляет к развилке ещё одно условие. Её условие проверяется, только если все условия выше оказались ложны.
Цепочка else if проверяет условия сверху вниз, выполняет первую ветку с истинным условием и пропускает остальные. Поэтому во второй ветке примера не написано percent < 90: программа доходит до неё, только когда percent >= 90 уже ложно.
Здесь развилка отличается от настоящей дороги. Путник может выбрать самый удобный из указателей, а Swift читает их строго сверху вниз и идёт по первому подходящему. Поставьте percent >= 60 выше percent >= 90, и excellent не напечатается ни при каком проценте.
else
У ветки else нет условия. Она выполняется, когда ложны все условия выше, и всегда стоит последней. Если её нет и ни одно условие не истинно, не выполнится ни одна ветка.
Скобки
Круглые скобки вокруг условия не нужны: Swift примет и if (percent >= 90), но так обычно не пишут. А фигурные скобки вокруг ветки обязательны, даже если в ней одна строка:
if percent >= 60 print("pass") // ✗error: expected '{' after 'if' conditionКомпилятор ждал { сразу после условия, а нашёл print.
Условие типа Bool
Условие в if должно иметь тип Bool. Подходят:
- сравнение, например
percent >= 60; - несколько сравнений через
&&,||и!; - константа или переменная типа
Bool.
Число условием не бывает. В C и похожих на него языках 0 считается ложью, а любое другое число — истиной, но Swift так не делает:
let messages = 2
if messages { // ✗
print("you have mail")
}error: type 'Int' cannot be used as a boolean; test for '!= 0' insteadПрограмма не компилируется, и компилятор сам подсказывает исправление: сравнить число с нулём, if messages != 0. Сравнение даёт Bool, и по коду сразу видно, что именно проверяет условие.
Частая ошибка
В условии написали один знак = вместо двух:
var attempts = 3
if attempts = 0 { // ✗
print("no attempts left")
}error: use of '=' in a boolean context, did you mean '=='?Один знак = кладёт значение в переменную, а два знака == сравнивают значения. Компилятор Swift ловит эту опечатку и не собирает программу. Правильно писать if attempts == 0.
Главное
ifвыполняет ветку, когда условие истинно, аelse— когда ложны все условия выше.- Цепочка
else ifпроверяет условия сверху вниз и выполняет только первую ветку с истинным условием. - Условие имеет тип
Bool: число вместо условия не компилируется, нужно сравнение вроде!= 0. - Фигурные скобки вокруг ветки обязательны, а круглые вокруг условия не нужны.