Условия, циклы и 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.

Проверьте себя
1. Чем switch-выражение Dart 3 отличается от старого switch-оператора?
AНичем, это синонимы
BВыражение возвращает значение и не требует break
CВыражение медленнее работает
DОператор поддерживает стрелки =>
2. Что означает ветка _ в switch-выражении?
AПустую строку
BОшибку
CСлучай «всё остальное» (по умолчанию)
DПриватную переменную