DMarlon Studio

Lección 7 · 7 de 20

switch y expresiones switch · Dart

Elija entre muchos casos con switch en Dart 3: la sentencia clásica, la nueva expresión switch con =>, patrones como || y >=, y guardas when.

Dart · switch y expresiones switch en DMarlon Studio: el código del ejemplo y su salida en la terminal

La sentencia `switch` compara un valor con cada case y ejecuta el que coincide. En Dart 3 no hace falta break: al terminar un caso, el switch acaba. case 'Sat' || 'Sun': reúne dos valores en un solo caso, y `default` recoge todo lo demás.

La expresión `switch` es la novedad de Dart 3: en lugar de ejecutar instrucciones, devuelve un valor, que aquí se guarda en season. Cada caso es patrón => valor, separados por comas, y `_` es el comodín que coincide con cualquier cosa. Con ella, elegir la estación de un mes cabe en unas pocas líneas.

Los casos son patrones, y un patrón puede comparar: >= 90 => 'A' se cumple con cualquier número mayor o igual que 90. Como Dart los prueba en orden, la nota 84 no llega a >= 90 pero sí a >= 70, y la expresión cabe en una sola línea.

Los patrones se combinan con `&&`: >= 0 && <= 50 es un intervalo. Y `when` añade una condición más, que puede mirar otras variables: _ when school solo se cumple si school es true. Por eso 65 km/h da too fast near a school.

Una expresión switch tiene que cubrir todos los casos posibles; si falta el _, Dart avisa antes de ejecutar. Es la forma más clara de convertir un valor en otro.

Código · main.dart

void main() {  String day = 'Sat'; // switch runs the case that matches  switch (day) {    case 'Sat' || 'Sun':      print('$day: weekend, the shop opens at 10.');    default:      print('$day: open from 9 to 8.');  }  // switch expression: gives back a value. _ catches the rest.  int month = 4;  String season = switch (month) {    12 || 1 || 2 => 'winter',    3 || 4 || 5 => 'spring',    6 || 7 || 8 => 'summer',    _ => 'autumn',  };  print('Month $month is in $season.');  // Patterns can also compare: >= 90, >= 70...  int score = 84;  String grade = switch (score) { >= 90 => 'A', >= 70 => 'B', >= 50 => 'C', _ => 'F' };  print('Score $score: grade $grade');  // && joins two patterns; "when" adds an extra condition.  int speed = 65;  bool school = true;  String note = switch (speed) {    >= 0 && <= 50 => 'within the limit',    _ when school => 'too fast near a school',    _ => 'slow down',  };  print('$speed km/h: $note');}

Salida · dart run main.dart

Sat: weekend, the shop opens at 10.
Month 4 is in spring.
Score 84: grade B
65 km/h: too fast near a school

Para recordar

  • En Dart 3 los case no necesitan break.
  • switch (x) { patrón => valor, ... } devuelve un valor.
  • _ coincide con cualquier cosa.
  • ||, >= y && forman patrones.
  • when añade una condición a un caso.

Ejercicio

Con una expresión switch, convierta una variable day de 1 a 7 en el nombre del día en inglés, y use _ para escribir invalid day con cualquier otro número.