Перейти к содержимому
Теория · Условия · урок 1 из 5

if и else

Чему вы научитесь

Чему вы научитесь:

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

Представьте развилку дороги с указателем: «Если идёт дождь — налево, к остановке. Иначе — направо, через парк». Вы читаете условие и выбираете одну дорогу, а по другой в этот раз не идёте.

До сих пор программа выполняла все строки подряд, сверху вниз. Но часто ей нужна такая же развилка: напечатать одно или другое, посчитать так или иначе. Для этого есть инструкция if. Она выполняет блок в фигурных скобках, только если условие истинно, а блок после else — когда оно ложно:

SWIFT
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")
}

Давайте пройдём по программе:

  1. percent получает 17 * 100 / 20, то есть 85.
  2. if percent >= 90 — условие ложно, и программа пропускает первую ветку.
  3. else if percent >= 60 — условие истинно, и программа печатает pass.
  4. Ветку 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), но так обычно не пишут. А фигурные скобки вокруг ветки обязательны, даже если в ней одна строка:

SWIFT
if percent >= 60 print("pass") // ✗
TEXT
error: expected '{' after 'if' condition

Компилятор ждал { сразу после условия, а нашёл print.

Условие типа Bool

Условие в if должно иметь тип Bool. Подходят:

  • сравнение, например percent >= 60;
  • несколько сравнений через &&, || и !;
  • константа или переменная типа Bool.

Число условием не бывает. В C и похожих на него языках 0 считается ложью, а любое другое число — истиной, но Swift так не делает:

SWIFT
let messages = 2
if messages { // ✗
    print("you have mail")
}
TEXT
error: type 'Int' cannot be used as a boolean; test for '!= 0' instead

Программа не компилируется, и компилятор сам подсказывает исправление: сравнить число с нулём, if messages != 0. Сравнение даёт Bool, и по коду сразу видно, что именно проверяет условие.

Частая ошибка

В условии написали один знак = вместо двух:

SWIFT
var attempts = 3
if attempts = 0 { // ✗
    print("no attempts left")
}
TEXT
error: use of '=' in a boolean context, did you mean '=='?

Один знак = кладёт значение в переменную, а два знака == сравнивают значения. Компилятор Swift ловит эту опечатку и не собирает программу. Правильно писать if attempts == 0.

Главное

  • if выполняет ветку, когда условие истинно, а else — когда ложны все условия выше.
  • Цепочка else if проверяет условия сверху вниз и выполняет только первую ветку с истинным условием.
  • Условие имеет тип Bool: число вместо условия не компилируется, нужно сравнение вроде != 0.
  • Фигурные скобки вокруг ветки обязательны, а круглые вокруг условия не нужны.