Эту картину я знаю с начальной школы. На этом примере мы и рассмотрим оператор выбора Switch и опции выбора Case

void main() {
	int quarterGrade = 1;
	print(getReward(quarterGrade));
}
 
String getReward(int grade) {
	String reward;
 
	switch (grade) {
		case 5:
			reward = "Bicycle";
			break;
		case 4:
			reward = "GoPro";
			break;
		case 3:
			reward = "No prize";
			break;
		case 2:
			reward = "Lost time and bad mood";
			break;
		case 1:
			reward = "Better not to ask";
			break;
		default:
			reward = "This grade does not exist";
	}
 
	return reward;
}Каждое значение в switch-case завершается оператором break, который предотвращает дальнейшее выполнение следующего блока case. Если break не использовать, выполнение просто перейдёт к следующему case, что бывает удобно, если несколько вариантов должны приводить к одному и тому же результату. Завершается конструкция блоком default, который обрабатывает все не предусмотренные в case значения, то есть служит универсальным вариантом на случай неожиданных данных.
Когда возможны множественные варианты выбора, switch и case оказываются удобным инструментом. Это тот самый случай, когда можно сказать: «Направо пойдёшь – коня потеряешь, прямо…». Такой алгоритм отлично подходит для ситуаций, где определённый вход должен привести к строго заданному результату.

Один из самых распространённых примеров использования switch в учебниках — календарь. Ведь у нас есть 12 месяцев, каждому из которых соответствует уникальное название и ID.
void main() {
  int month = 8;
  print(getMonthName(month));
}
 
String getMonthName(int month) {
  switch (month) {
    case 1:
      return "January";
    case 2:
      return "February";
    case 3:
      return "March";
    case 4:
      return "April";
    case 5:
      return "May";
    case 6:
      return "June";
    case 7:
      return "July";
    case 8:
      return "August";
    case 9:
      return "September";
    case 10:
      return "October";
    case 11:
      return "November";
    case 12:
      return "December";
    default:
      return "Invalid month";
  }
}Dart не требует break в switch, поскольку return автоматически завершает выполнение функции. Мы можем либо использовать одну переменную и возвращать её в конце, либо завершать каждый вариант с помощью return. Оба стиля корректны.
Первый стиль — с переменной и единым return — делает код более читабельным для новичков, особенно тех, кто переходит с Java или других строго типизированных языков.
Второй стиль, где return используется внутри каждого case, делает код короче и в некоторых случаях удобнее.
Первый вариант, больше характерен для учебников по Java, тогда как второй ближе к JavaScript. Это вопрос предпочтений, но я бы рекомендовал начинающим придерживаться первого подхода — хотя бы до тех пор, пока не станет понятно, как каждый из них влияет на код. А возможно, в будущем вы и вовсе обойдётесь без switch — в программировании существует множество способов выразить свои мысли. И один из альтернативных вариантов — это использование условных операторов if else.

Оператор if имеет схожие функции и примерно те же цели, но с небольшими отличиями, которые касаются условий. Если вы не уверены, всегда можно проверить это в Google, например, запросив “switch vs if comparison”. На Хабре, например, есть несколько статей, обсуждающих эстетику, скорость, эффективность и методы использования этих операторов.
Нас пока эстетика не сильно интересует. Мы учимся синтаксису.
Допустим, если родители дали разрешение (условие — true), я поеду в летний лагерь, а если нет — останусь дома.
// Метод для проверки разрешения от родителей
void checkSummerCampPermission(bool isPermissionGranted) {
	if (isPermissionGranted) {
		print("Я поеду в летний лагерь");
	} else {
		print("Я останусь на всё лето дома");
	}
}
 
void main() {
	// Пример: родитель дал разрешение
	bool permission = true;
	checkSummerCampPermission(permission);
 
	// Пример: родитель не дал разрешение
	permission = false;
	checkSummerCampPermission(permission);
}Для этого примера не имеет смысла использовать switch, потому что у нас всего два варианта, и в этом заключается одно из отличий между if-else и switch.
Главное преимущество if-else — возможность выполнить несколько команд в одном блоке. Рассмотрим пример с ракетой и ускорением свободного падения:
void checkRocketLaunch(int a) {
  const int superConstantG = 10;
 
  if (a < superConstantG) {
    print("Начальное ускорение недостаточно");
    print("Ракета не может стартовать");
    print("Подготовить аварийные службы");
  } else {
    print("Ракета улетает в космос");
    print("Выпустить пресс-релиз об успешном запуске");
    print("Подготовить программистов к государственным наградам");
  }
}
 
void main() {
  checkRocketLaunch(5);
}Здесь мы видим, что если начальное ускорение меньше константы, выполняются несколько команд для подготовки к аварийному сценарию.
В switch нельзя проверить, например, “младше 18 лет”, а с помощью if-else это легко сделать:
void checkAlcoholSale(int age) {
  if (age < 16) {
    print("Алкоголь и сигареты продавать нельзя!!!");
  } else if (age >= 18) {
    print("Можно продавать алкоголь и сигареты");
  } else {
    print("Водку продавать нельзя, а пиво и сигареты можно");
  }
}
 
void main() {
  checkAlcoholSale(40);
}Иногда программисты шутят, что основная работа разработчика заключается в написании if-else и switch операторов. И, возможно, это не так уж далеко от истины. Основные конструкции, такие как эти, действительно часто встречаются в коде и являются основой многих алгоритмов и программ.
Действия сотрудника дорожной полиции Напишите программу для дорожного полицейского, который останавливает автомобиль и проверяет его скорость. Программа должна анализировать скорость автомобиля и предпринимать соответствующие действия:
Светофор Напишите программу для машины, стоящей на светофоре. Программа должна выводить действия водителя в зависимости от сигнала светофора:
Зарплата с надбавкой за стаж Напишите программу для расчета зарплаты сотрудника магазина с учетом стажа работы. Базовая зарплата составляет 500$. Для сотрудников:
Вывод даты
Напишите программу, которая выводит дату в формате dd-mm-yyyy. Программа должна принимать на вход день, месяц и год, а также разделитель (например, "-"). Она должна проверять, чтобы день и месяц были в пределах нормальных значений (от 1 до 31 для дня и от 1 до 12 для месяца), а если нужно, дописывать нули.
Алкогольный контроль Напишите программу, которая проверяет возраст покупателя и решает, можно ли продать алкоголь. Программа должна проверять:
Определение сезона года Напишите программу, которая определяет сезон года по месяцу. Программа должна принять месяц как целое число (от 1 до 12) и вывести:
Выбор таблетки в Матрице Напишите программу, которая моделирует выбор таблетки в Матрице. Программа должна запросить у пользователя, какую таблетку он выбирает:
Лифт
Как бы вы написали программу управления лифтом?
