Skip to content

День 5 — Условия

Условия позволяют программе принимать решения: открыть экран только авторизованному пользователю, показать ошибку для пустого имени или выбрать сообщение по результату игры.

Операторы сравнения

Сравнение возвращает Bool.

swift
let age = 18

print(age == 18) // равно
print(age != 18) // не равно
print(age > 16)
print(age <= 21)

Один знак = присваивает значение, два знака == сравнивают. Это частая опечатка новичка, которую компилятор обычно быстро обнаруживает.

Строки тоже можно сравнивать:

swift
let first = "Анна"
let second = "Борис"

print(first == second)
print(first < second) // алфавитный порядок по Unicode

if и else

Код внутри if выполняется, только когда условие равно true.

swift
let speed = 72

if speed > 60 {
    print("Снизьте скорость")
} else {
    print("Скорость в норме")
}

Дополнительные ветки записываются через else if:

swift
let score = 84

if score >= 90 {
    print("Отлично")
} else if score >= 70 {
    print("Хорошо")
} else {
    print("Стоит повторить тему")
}

Порядок важен. Swift выбирает первую подходящую ветку и остальные уже не проверяет.

Несколько условий

&& означает «и»: обе части должны быть истинны. || означает «или»: достаточно одной истинной части.

swift
let hasTicket = true
let age = 20

if hasTicket && age >= 18 {
    print("Вход разрешён")
}

let isAdmin = false
let isOwner = true

if isAdmin || isOwner {
    print("Можно редактировать")
}

Оператор ! меняет логическое значение на противоположное.

swift
let isBlocked = false

if !isBlocked {
    print("Сообщение можно отправить")
}

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

Не пишите if isReady == true. Сам isReady уже является условием: if isReady { ... }.

switch

switch удобен, когда одно значение сравнивается с несколькими вариантами.

swift
enum Weather {
    case sun, rain, snow
}

let weather = Weather.rain

switch weather {
case .sun:
    print("Возьмите очки")
case .rain:
    print("Нужен зонт")
case .snow:
    print("Одевайтесь теплее")
}

Swift требует исчерпывающий switch: должны быть обработаны все возможные значения. Для открытого набора, например Int, используется default.

swift
let place = 2

switch place {
case 1:
    print("Золото")
case 2:
    print("Серебро")
case 3:
    print("Бронза")
default:
    print("Спасибо за участие")
}

Диапазоны в switch

swift
let score = 78

switch score {
case 0..<50:
    print("Нужно повторить")
case 50..<80:
    print("Хорошо")
case 80...100:
    print("Отлично")
default:
    print("Некорректный балл")
}

0..<50 содержит числа от 0 до 49: правая граница не входит. 80...100 включает и 80, и 100.

fallthrough

По умолчанию Swift не переходит к следующему case. Ключевое слово fallthrough заставляет выполнить и следующую ветку, но используется редко: чаще яснее объединить варианты через запятую.

swift
let day = "суббота"

switch day {
case "суббота", "воскресенье":
    print("Выходной")
default:
    print("Рабочий день")
}

Тернарный оператор

Тернарный оператор выбирает одно из двух значений:

swift
let age = 17
let access = age >= 18 ? "Разрешён" : "Запрещён"

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

if и switch как выражения

В современном Swift ветвление может сразу вернуть значение. Это удобнее, чем объявлять var и менять его в каждой ветке.

swift
let score = 84
let result = if score >= 80 {
    "Отлично"
} else if score >= 60 {
    "Зачёт"
} else {
    "Повторить тему"
}

Каждая ветка должна дать значение совместимого типа. Такая запись появилась в Swift 5.9.

Практика

Checkpoint

Условие

По значению temperature создайте строку: ниже нуля — «мороз», от 0 до 19 — «прохладно», от 20 до 29 — «тепло», иначе — «жарко». Используйте switch expression.

Что нужно знать

  • диапазоны;
  • исчерпывающий switch;
  • ветвление как выражение.
Показать подсказку

Для отрицательных значений подойдёт ..<0, а последней веткой будет default.

Показать решение
swift
let temperature = 24

let description = switch temperature {
case ..<0: "мороз"
case 0..<20: "прохладно"
case 20..<30: "тепло"
default: "жарко"
}

print(description)

Что запомнить

if хорош для произвольных условий. switch особенно силён для исчерпывающей обработки вариантов enum.

Переход между соседними страницами: и вне полей ввода.

ОБСУЖДЕНИЕ

Комментарии

Вопросы, находки и подсказки по этой странице.

Загружаем комментарии…