I. Standard-for-Schleife
Syntax: for(Initialisierung; Bedingung; Iteration) { Schleifenkörper }
1: Einfache String-Verkettung
void main() {
var message = StringBuffer('welcome to FoxDevelop.com');
for (var i = 0; i < 5; i++) {
message.write('!');
}
print(message); // welcome to FoxDevelop.com!!!!!
}Code-Sprache: Dart (dart)
Die Schleife läuft von 0 bis 5 (5 ist ausgeschlossen), also nimmt i die Werte 0 bis 4 an und wird insgesamt fünfmal ausgeführt. Bei jedem Durchlauf wird ein Ausrufezeichen an das Ende des Strings angehängt.
1. Durchlauf: welcome to FoxDevelop.com!
2. Durchlauf: welcome to FoxDevelop.com!!
…
5. Durchlauf: welcome to FoxDevelop.com!!!!!
Besonderheit: Closures binden separaten Index (wichtiger Unterschied zu JavaScript)
Dart erstellt für jeden Schleifendurchlauf eine unabhängige Variable i. Dadurch entsteht nicht das bekannte JavaScript-Problem, bei dem alle Callbacks den Wert 2 ausgeben.
void main() {
var callbacks = [];
for (var i = 0; i < 2; i++) {
callbacks.add(() => print(i));
}
for (final c in callbacks) {
c();
}
}
// Ausgabe
// 0
// 1
Code-Sprache: Dart (dart)
II. for-in zur Iteration über Iterable-Objekte (List/Set)
Geeignet für Fälle, bei denen nur der Wert ohne Index benötigt wird.
Grundlegende Schreibweise
class Candidate {
void interview() => print("Interview abgeschlossen");
}
void main() {
var candidates = [Candidate(), Candidate()];
for (var candidate in candidates) {
candidate.interview();
}
}Code-Sprache: Dart (dart)
Iteriert über die Liste candidates, speichert jedes Element in die Variable candidate und ruft deren Methode interview() auf. Nach jedem Element wechselt der Iterator automatisch zum nächsten Eintrag.
Erweiterte Anwendung
for-in kombiniert mit Objekt-Pattern-Destrukturierung (ab Dart 3)
class Candidate {
final String name;
final int yearsExperience;
Candidate({required this.name, required this.yearsExperience});
}
void main() {
var candidates = [
Candidate(name: "Lily", yearsExperience: 6),
Candidate(name: "Tom", yearsExperience: 3),
];
// Direkte Destrukturierung von Klassenfeldern via Objekt-Pattern
for (final Candidate(:name, :yearsExperience) in candidates) {
print('$name verfügt über $yearsExperience Jahre Berufserfahrung');
}
}
Code-Sprache: Dart (dart)
In Kombination mit der vorherigen Pattern-Destrukturierung werden die beiden Objekteigenschaften automatisch in die Variablen name und yearsExperience extrahiert, die anschließend im Schleifenkörper verwendet werden können.
III. Iterable.forEach() Iterationsmethode
Funktionaler Iterator, der in allen Sammlungen integriert ist. Übergebe einen Callback zur Verarbeitung jedes Elements.
void main() {
var collection = [1, 2, 3];
collection.forEach(print);
// Ausgabe 1 2 3
}Code-Sprache: Dart (dart)
forEach ist eine native Dart-Methode, die auf jeder iterierbaren Sammlung aufgerufen werden kann.
IV. while / do-while Schleifen
1. while-Schleife
Zuerst wird die Bedingung geprüft, dann der Körper ausgeführt – der Schleifeninhalt kann auch gar nicht laufen. Funktioniert identisch wie bei C, C++, Java, C# und weiteren Sprachen.
bool isDone() => false;
void doSomething() => print("Aufgabe ausführen");
void main() {
while (!isDone()) {
doSomething();
break;
}
}Code-Sprache: Dart (dart)
Zuerst wird !isDone() ausgewertet: die Funktion gibt false zurück, die Negation ergibt true, also wird der Blockinhalt ausgeführt:
doSomething();
break;
Tritt break auf, wird die gesamte Schleife sofort beendet und der Code nach dem while-Block ausgeführt. Wenn isDone() stattdessen true liefert, schlägt die erste Bedingungsprüfung fehl und der Inhalt läuft kein einziges Mal.
2. do-while-Schleife
Der Körper wird zuerst einmal ausgeführt, danach erst die Bedingung geprüft – mindestens ein Durchlauf ist garantiert.
bool atEndOfPage() => true;
void printLine() => print("Eine Zeile ausgeben");
void main() {
do {
printLine();
} while (!atEndOfPage());
}
Code-Sprache: Dart (dart)
Unabhängig davon, ob die nachgestellte while-Bedingung true oder false ergibt, wird der Code innerhalb von do {} genau einmal ausgeführt.
V. break / continue Steueranweisungen
break
Beendet die gesamte Schleife sofort und springt zu dem Code nach der Schleife. Verbleibende Anweisungen im Schleifenkörper werden nicht ausgeführt.
bool shutDownRequested() => true;
void processIncomingRequests() => print("Anfragen verarbeiten");
void main() {
while (true) {
if (shutDownRequested()) break;
processIncomingRequests();
}
print("Schleife beendet");
}
Code-Sprache: Dart (dart)
continue
Überspringt alle verbleibenden Anweisungen des aktuellen Durchlaufs und springt direkt zur nächsten Iteration.
Klassische for-Schreibweise
class Candidate {
final int yearsExperience;
Candidate(this.yearsExperience);
void interview() => print("Interview durchführen");
}
void main() {
var candidates = [Candidate(3), Candidate(6)];
for (int i = 0; i < candidates.length; i++) {
var candidate = candidates[i];
if (candidate.yearsExperience < 5) {
continue; // Bewerber mit weniger als 5 Jahren Erfahrung überspringen
}
candidate.interview();
}
}
Code-Sprache: Dart (dart)
Funktionaler Ersatz (ohne continue)
void main() {
var candidates = [Candidate(3), Candidate(6)];
candidates
.where((c) => c.yearsExperience >= 5)
.forEach((c) => c.interview());
}
Code-Sprache: Dart (dart)
VI. Labels zur Steuerung verschachtelter Schleifen
Syntax: Schreibe Labelname: vor eine Schleife, kombiniere mit break Labelname / continue Labelname
Zweck: Bei mehrfach verschachtelten Schleifen kannst du direkt die äußere Schleife verlassen oder überspringen – nicht nur die innerste.
1. break + Label
Verlassen einer doppelten Schleife
void main() {
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; // Äußere Schleife mit Label outerLoop sofort beenden
}
}
}
print('outerLoop exited');
}
Code-Sprache: Dart (dart)
Ausgabe:
i = 1, j = 1
i = 1, j = 2
i = 1, j = 3
i = 2, j = 1
i = 2, j = 2
outerLoop exited
Code-Sprache: Dart (dart)
2. continue + Label
Direkt zur nächsten Iteration der äußeren Schleife springen
void main() {
outerLoop:
for (var i = 1; i <= 3; i++) {
for (var j = 1; j <= 3; j++) {
if (i == 2 && j == 2) {
continue outerLoop; // Alle verbleibenden j-Werte für i=2 überspringen, direkt zu i=3
}
print('i = $i, j = $j');
}
}
}
Code-Sprache: Dart (dart)
Ausgabe:
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
Beispiel: while + break + Label
void main() {
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');
}
Code-Sprache: PHP (php)
Ausführungsergebnis
D:\dartdemo\firstdart>dart run
Building package executable...
Built firstdart:firstdart.
i = 1, j = 1
i = 1, j = 2
i = 1, j = 3
i = 2, j = 1
i = 2, j = 2
outerLoop exited
Dieser Mechanismus ähnelt der goto-Anweisung anderer Programmiersprachen.
Schleifen Loops