День 5 — Условия
Условия позволяют программе принимать решения: открыть экран только авторизованному пользователю, показать ошибку для пустого имени или выбрать сообщение по результату игры.
Операторы сравнения
Сравнение возвращает Bool.
let age = 18
print(age == 18) // равно
print(age != 18) // не равно
print(age > 16)
print(age <= 21)Один знак = присваивает значение, два знака == сравнивают. Это частая опечатка новичка, которую компилятор обычно быстро обнаруживает.
Строки тоже можно сравнивать:
let first = "Анна"
let second = "Борис"
print(first == second)
print(first < second) // алфавитный порядок по Unicodeif и else
Код внутри if выполняется, только когда условие равно true.
let speed = 72
if speed > 60 {
print("Снизьте скорость")
} else {
print("Скорость в норме")
}Дополнительные ветки записываются через else if:
let score = 84
if score >= 90 {
print("Отлично")
} else if score >= 70 {
print("Хорошо")
} else {
print("Стоит повторить тему")
}Порядок важен. Swift выбирает первую подходящую ветку и остальные уже не проверяет.
Несколько условий
&& означает «и»: обе части должны быть истинны. || означает «или»: достаточно одной истинной части.
let hasTicket = true
let age = 20
if hasTicket && age >= 18 {
print("Вход разрешён")
}
let isAdmin = false
let isOwner = true
if isAdmin || isOwner {
print("Можно редактировать")
}Оператор ! меняет логическое значение на противоположное.
let isBlocked = false
if !isBlocked {
print("Сообщение можно отправить")
}Частая ошибка
Не пишите if isReady == true. Сам isReady уже является условием: if isReady { ... }.
switch
switch удобен, когда одно значение сравнивается с несколькими вариантами.
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.
let place = 2
switch place {
case 1:
print("Золото")
case 2:
print("Серебро")
case 3:
print("Бронза")
default:
print("Спасибо за участие")
}Диапазоны в switch
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 заставляет выполнить и следующую ветку, но используется редко: чаще яснее объединить варианты через запятую.
let day = "суббота"
switch day {
case "суббота", "воскресенье":
print("Выходной")
default:
print("Рабочий день")
}Тернарный оператор
Тернарный оператор выбирает одно из двух значений:
let age = 17
let access = age >= 18 ? "Разрешён" : "Запрещён"Форма читается так: условие ? значениеЕслиДа : значениеЕслиНет. Она удобна для короткого выбора значения. Если в ветках появляется сложная логика, используйте обычный if.
if и switch как выражения
В современном Swift ветвление может сразу вернуть значение. Это удобнее, чем объявлять var и менять его в каждой ветке.
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.
Показать решение
let temperature = 24
let description = switch temperature {
case ..<0: "мороз"
case 0..<20: "прохладно"
case 20..<30: "тепло"
default: "жарко"
}
print(description)Что запомнить
if хорош для произвольных условий. switch особенно силён для исчерпывающей обработки вариантов enum.
Комментарии
Вопросы, находки и подсказки по этой странице.
Войди, чтобы задать вопрос или помочь другим.