Saltar al contenido principal

Bucles

Aprende cómo usar bucles para controlar el flujo de tu código Dart.

Esta página muestra cómo puedes controlar el flujo de tu código Dart usando bucles y sentencias de apoyo:

  • Bucles for
  • Bucles while y do-while
  • break y continue

También puedes manipular el control de flujo en Dart usando:

Bucles for

#

Puedes iterar con el bucle for estándar. Por ejemplo:

dart
var message = StringBuffer('Dart is fun');
for (var i = 0; i < 5; i++) {
  message.write('!');
}

Los closures dentro de los bucles for de Dart capturan el valor del índice. Esto evita un error común que se encuentra en JavaScript. Por ejemplo, considera:

dart
var callbacks = [];
for (var i = 0; i < 2; i++) {
  callbacks.add(() => print(i));
}

for (final c in callbacks) {
  c();
}

La salida es 0 y luego 1, como se esperaba. Por el contrario, el ejemplo imprimiría 2 y luego 2 en JavaScript.

A veces es posible que no necesites conocer el contador de iteración actual cuando iteras sobre un tipo Iterable, como List o Set. En ese caso, usa el bucle for-in para un código más limpio:

dart
for (var candidate in candidates) {
  candidate.interview();
}

En el bucle del ejemplo anterior, candidate se define dentro del cuerpo del bucle y se establece para hacer referencia a un valor de candidates a la vez. candidate es una variable local. Reasignar candidate dentro del cuerpo del bucle solo cambia la variable local para esa iteración y no modifica el iterable original candidates.

Para procesar los valores obtenidos del iterable, también puedes usar un patrón (pattern) en un bucle for-in:

dart
for (final Candidate(:name, :yearsExperience) in candidates) {
  print('$name has $yearsExperience of experience.');
}

Las clases iterables también tienen un método forEach() como otra opción:

dart
var collection = [1, 2, 3];
collection.forEach(print); // 1 2 3

While y do-while

#

Un bucle while evalúa la condición antes del bucle:

dart
while (!isDone()) {
  doSomething();
}

Un bucle do-while evalúa la condición después del bucle:

dart
do {
  printLine();
} while (!atEndOfPage());

Break y continue

#

Usa break para detener el bucle:

dart
while (true) {
  if (shutDownRequested()) break;
  processIncomingRequests();
}

Usa continue para saltar a la siguiente iteración del bucle:

dart
for (int i = 0; i < candidates.length; i++) {
  var candidate = candidates[i];
  if (candidate.yearsExperience < 5) {
    continue;
  }
  candidate.interview();
}

Si estás usando un Iterable como una lista o set, la forma en que escribas el ejemplo anterior podría diferir:

dart
candidates
    .where((c) => c.yearsExperience >= 5)
    .forEach((c) => c.interview());

Etiquetas

#

Una etiqueta (label) es un identificador seguido por dos puntos (labelName:) que puedes colocar antes de una sentencia para crear una sentencia etiquetada (labeled statement). Los bucles y los switch cases a menudo se usan como sentencias etiquetadas. Una sentencia etiquetada se puede referenciar más tarde en una sentencia break o continue de la siguiente manera:

  • break labelName; Termina la ejecución de la sentencia etiquetada. Esto es útil para salir de un bucle externo específico cuando estás dentro de un bucle anidado.

  • continue labelName; Omite el resto de la iteración actual del bucle de la sentencia etiquetada y continúa con la siguiente iteración.

Las etiquetas se utilizan para gestionar el flujo de control. A menudo se usan con bucles y switch cases, y te permiten especificar de qué sentencia salir o continuar, en lugar de afectar al bucle más interno por defecto.

Etiquetas en bucle for usando break

#

El siguiente código demuestra el uso de una etiqueta llamada outerLoop en un bucle for con una sentencia break:

dart
outerLoop:
for (var i = 1; i <= 3; i++) {
  for (var j = 1; j <= 3; j++) {
    print('i = $i, j = $j');
    if (i == 2 && j == 2) {
      break outerLoop;
    }
  }
}
print('outerLoop exited');

En el ejemplo anterior, cuando i == 2 y j == 2, la sentencia break outerLoop; detiene tanto el bucle interno como el externo. Como resultado, la salida es:

i = 1, j = 1
i = 1, j = 2
i = 1, j = 3
i = 2, j = 1
i = 2, j = 2
outerLoop exited

Etiquetas en bucle for usando continue

#

El siguiente código demuestra el uso de una etiqueta llamada outerLoop en un bucle for con una sentencia continue:

dart
outerLoop:
for (var i = 1; i <= 3; i++) {
  for (var j = 1; j <= 3; j++) {
    if (i == 2 && j == 2) {
      continue outerLoop;
    }
    print('i = $i, j = $j');
  }
}

En el ejemplo anterior, cuando i == 2 y j == 2, continue outerLoop; omite el resto de las iteraciones para i = 2 y pasa a i = 3. Como resultado, la salida es:

i = 1, j = 1
i = 1, j = 2
i = 1, j = 3
i = 2, j = 1
i = 3, j = 1
i = 3, j = 2
i = 3, j = 3

Etiquetas en bucle while usando break

#

El siguiente código demuestra el uso de una etiqueta llamada outerLoop en un bucle while con una sentencia break:

dart
var i = 1;

outerLoop:
while (i <= 3) {
  var j = 1;
  while (j <= 3) {
    print('i = $i, j = $j');
    if (i == 2 && j == 2) {
      break outerLoop;
    }
    j++;
  }
  i++;
}
print('outerLoop exited');

En el ejemplo anterior, el programa sale tanto del bucle while interno como del externo cuando i == 2 y j == 2. Como resultado, la salida es:

i = 1, j = 1
i = 1, j = 2
i = 1, j = 3
i = 2, j = 1
i = 2, j = 2
outerLoop exited

Etiquetas en bucle while usando continue

#

El siguiente código demuestra el uso de una etiqueta llamada outerLoop en un bucle while con una sentencia continue:

dart
var i = 1;

outerLoop:
while (i <= 3) {
  var j = 1;
  while (j <= 3) {
    if (i == 2 && j == 2) {
      i++;
      continue outerLoop;
    }
    print('i = $i, j = $j');
    j++;
  }
  i++;
}

En el ejemplo anterior, se omite la iteración para i = 2 y j = 2 y el bucle pasa directamente a i = 3. Como resultado, la salida es:

i = 1, j = 1
i = 1, j = 2
i = 1, j = 3
i = 2, j = 1
i = 3, j = 1
i = 3, j = 2
i = 3, j = 3

Etiquetas en bucle do-while usando break

#

El siguiente código demuestra el uso de una etiqueta llamada outerLoop en un bucle do-while con una sentencia break:

dart
var i = 1;

outerLoop:
do {
  var j = 1;
  do {
    print('i = $i, j = $j');
    if (i == 2 && j == 2) {
      break outerLoop;
    }
    j++;
  } while (j <= 3);
  i++;
} while (i <= 3);

print('outerLoop exited');

En el ejemplo anterior, el programa sale tanto del bucle interno como del externo cuando i == 2 y j == 2. Como resultado, la salida es:

i = 1, j = 1
i = 1, j = 2
i = 1, j = 3
i = 2, j = 1
i = 2, j = 2
outerLoop exited

Etiquetas en bucle do-while usando continue

#

El siguiente código demuestra el uso de una etiqueta llamada outerLoop en un bucle do-while con una sentencia continue:

dart
var i = 1;

outerLoop:
do {
  var j = 1;
  do {
    if (i == 2 && j == 2) {
      i++;
      continue outerLoop;
    }
    print('i = $i, j = $j');
    j++;
  } while (j <= 3);
  i++;
} while (i <= 3);

En el ejemplo anterior, el bucle omite i = 2 y j = 2 y pasa directamente a i = 3. Como resultado, la salida es:

i = 1, j = 1
i = 1, j = 2
i = 1, j = 3
i = 2, j = 1
i = 3, j = 1
i = 3, j = 2
i = 3, j = 3