Условия, циклы и switch-выражения
Программа без ветвлений просто выполняет шаги подряд; условия и циклы дают ей принимать решения и повторять действия.
Суть:
if/elseвыбирает путь, циклыforиwhileповторяют код, а switch-выражения Dart 3 компактно сопоставляют значение с вариантами и возвращают результат.
Отдельного внимания заслуживает связь ветвлений с интерфейсом. Во Flutter условие нередко возвращает не строку, а целый виджет: isLoading ? Spinner() : Content(). Тернарный оператор прямо внутри дерева виджетов выбирает, что показать пользователю. А switch-выражение, возвращающее значение, идеально ложится на отрисовку разных состояний экрана одним компактным блоком — вы оцените это, когда дойдёте до раздела про состояние.
Любая осмысленная программа должна реагировать на разные ситуации: если пользователь авторизован — показать профиль, иначе — экран входа. За это отвечает if/else. А когда нужно сделать что-то много раз — пройтись по списку товаров, нарисовать десять звёздочек рейтинга — на помощь приходят циклы.
int score = 85;
if (score >= 90) {
print('Отлично');
} else if (score >= 60) {
print('Зачёт');
} else {
print('Пересдача');
}
// тернарный оператор — if/else в одну строку:
String result = score >= 60 ? 'сдал' : 'не сдал';
for (int i = 0; i < 3; i++) {
print('Шаг $i');
}
for (final item in ['a', 'b', 'c']) { // for-in по коллекции
print(item);
}
Как работают switch-выражения под капотом
В Dart 3 появился важный апгрейд: switch-выражение. Старый switch был оператором — он выполнял код, но ничего не возвращал, и требовал break в каждой ветке. Новое switch-выражение возвращает значение, использует стрелки => и не нуждается в break. Это резко сокращает код и делает его выразительнее.
старый switch (оператор) switch-выражение (Dart 3)
------------------------- -------------------------
switch (day) { final name = switch (day) {
case 1: 1 => 'Пн',
x = 'Пн'; break; 2 => 'Вт',
case 2: _ => 'другой',
x = 'Вт'; break; };
default: x = '...';
} возвращает значение напрямую
int day = 3;
final name = switch (day) {
1 => 'Понедельник',
2 => 'Вторник',
3 => 'Среда',
_ => 'Другой день', // _ — это «всё остальное» (обязателен)
};
print(name); // Среда
Символ _ — это wildcard, ветка «по умолчанию». Switch-выражение должно покрывать все случаи, поэтому _ обычно ставят последним. Когда вы дойдёте до sealed-классов, switch научится проверять полноту вариантов автоматически.
Смоделируем сопоставление вариантов на Python — это языко-независимая логика switch:
# Аналог switch-выражения Dart 3: значение -> результат
def day_name(day):
table = {1: 'Понедельник', 2: 'Вторник', 3: 'Среда'}
return table.get(day, 'Другой день') # .get с дефолтом = ветка _
for d in [1, 3, 7]:
print(d, '->', day_name(d))
# Цикл с условием — фильтрация чётных
evens = []
for n in range(1, 11):
if n % 2 == 0:
evens.append(n)
print('Чётные:', evens)
Частые ошибки
- Бесконечный
whileбез изменения условия — программа зависает. Всегда двигайте счётчик к выходу. - Забыть ветку
_в switch-выражении — компилятор потребует покрыть все случаи. - Использовать
=вместо==в условии.=— присваивание,==— сравнение.
Best practices
- Для простого «или-или» используйте тернарный оператор; для трёх и более вариантов — switch-выражение.
- Предпочитайте
for-inобычномуforс индексом, когда индекс не нужен — код чище. - Не вкладывайте больше двух-трёх
ifдруг в друга; выносите логику в функции или используйте switch.
Стоит знать и про управляющие слова внутри циклов: break досрочно прерывает цикл, а continue пропускает текущую итерацию и переходит к следующей. Они помогают писать понятную логику без вложенных флагов. Но злоупотреблять ими не нужно: часто более ясное решение — это where с условием вместо цикла с continue, о чём мы поговорим в разделе про коллекции.
Итог: условия и циклы — это нервная система программы. Освойте switch-выражения Dart 3: они короче, безопаснее и идеально лягут на работу с состоянием экранов в Flutter.