I. Boucle for standard
Syntaxe : for(initialisation; condition; itérateur) { corps de boucle }
1 : Concaténation basique de chaînes
void main() {
var message = StringBuffer('welcome to FoxDevelop.com');
for (var i = 0; i < 5; i++) {
message.write('!');
}
print(message); // welcome to FoxDevelop.com!!!!!
}Langage du code : Dart (dart)
La boucle s’exécute de 0 à 5 (5 exclu), c’est-à-dire que i prend les valeurs 0 à 4 pour un total de cinq itérations. Chaque fois, un point d’exclamation est ajouté à la fin de la chaîne.
1ère fois : welcome to FoxDevelop.com!
2ème fois : welcome to FoxDevelop.com!!
…
5ème fois : welcome to FoxDevelop.com!!!!!
Caractéristique : capture d’index par fermeture (différence majeure avec JavaScript)
Dart lie une variable i indépendante à chaque itération, ce qui évite le défaut de JavaScript où tous les rappels affichent la valeur finale 2.
void main() {
var callbacks = [];
for (var i = 0; i < 2; i++) {
callbacks.add(() => print(i));
}
for (final c in callbacks) {
c();
}
}
// Sortie
// 0
// 1
Langage du code : Dart (dart)
II. Boucle for-in pour parcourir des objets itérables List/Set
Adapté aux cas où vous n’avez pas besoin de l’indice, seulement de la valeur de l’élément.
Écriture basique
class Candidate {
void interview() => print("Entretien terminé");
}
void main() {
var candidates = [Candidate(), Candidate()];
for (var candidate in candidates) {
candidate.interview();
}
}Langage du code : Dart (dart)
Parcourt la liste candidates, stocke chaque élément dans la variable candidate puis appelle sa méthode interview(). Après chaque lecture, l’itérateur passe automatiquement à l’élément suivant.
Utilisation avancée
for-in associé à la déstructuration de motif d’objet (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),
];
// Déstructuration directe des champs via le motif objet
for (final Candidate(:name, :yearsExperience) in candidates) {
print('$name possède $yearsExperience années d’expérience professionnelle');
}
}
Langage du code : Dart (dart)
Combiné à la déstructuration vue précédemment, il extrait automatiquement les deux propriétés de l’objet dans les variables name et yearsExperience, utilisables directement dans le corps de boucle.
III. Méthode de parcours Iterable.forEach ()
Parcours fonctionnel natif aux collections, passez un rappel pour traiter chaque élément.
void main() {
var collection = [1, 2, 3];
collection.forEach(print);
// Sortie 1 2 3
}Langage du code : Dart (dart)
forEach est une méthode native de Dart accessible sur toute collection itérable.
IV. while / do-while
1. while
Vérifie la condition avant d’exécuter le corps ; la boucle peut ne jamais s’exécuter. Fonctionne identiquement à C, C++, Java, C# et d’autres langages.
bool isDone() => false;
void doSomething() => print("Exécuter la tâche");
void main() {
while (!isDone()) {
doSomething();
break;
}
}Langage du code : Dart (dart)
On évalue d’abord !isDone() : la fonction renvoie false, la négation donne true donc le bloc s’exécute :
doSomething();
break;
L’instruction break termine immédiatement la boucle et saute au code après le bloc while. Si isDone() renvoyait true, la première vérification échouerait et le corps ne s’exécuterait pas du tout.
2. do-while
Exécute le corps une première fois sans condition, puis vérifie la contrainte : au moins une exécution est garantie.
bool atEndOfPage() => true;
void printLine() => print("Afficher une ligne");
void main() {
do {
printLine();
} while (!atEndOfPage());
}
Langage du code : Dart (dart)
Que la condition du while soit vraie ou fausse, le code dans le bloc do {} s’exécute obligatoirement une fois.
V. break / continue
break
Arrête complètement la boucle instantanément et saute aux instructions suivantes ; le reste du corps n’est pas exécuté.
bool shutDownRequested() => true;
void processIncomingRequests() => print("Traiter les requêtes");
void main() {
while (true) {
if (shutDownRequested()) break;
processIncomingRequests();
}
print("Fin de la boucle");
}
Langage du code : Dart (dart)
continue
Ignore toutes les instructions restantes de l’itération en cours et passe directement à l’itération suivante.
Écriture for traditionnelle
class Candidate {
final int yearsExperience;
Candidate(this.yearsExperience);
void interview() => print("Réaliser l’entretien");
}
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; // Les candidats avec moins de 5 ans d’expérience sont ignorés
}
candidate.interview();
}
}
Langage du code : Dart (dart)
Alternative fonctionnelle (sans continue)
void main() {
var candidates = [Candidate(3), Candidate(6)];
candidates
.where((c) => c.yearsExperience >= 5)
.forEach((c) => c.interview());
}
Langage du code : Dart (dart)
VI. Labels pour contrôler des boucles imbriquées
Syntaxe : placer NomLabel: devant une boucle, utiliser avec break NomLabel / continue NomLabel
Utilité : avec des boucles multiples imbriquées, sortir ou sauter directement la boucle externe au lieu de ne gérer que l’interne.
1. break + label
Sortir d’une double boucle
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; // Terminer immédiatement la boucle externe marquée outerLoop
}
}
}
print('outerLoop exited');
}
Langage du code : Dart (dart)
Sortie :
i = 1, j = 1
i = 1, j = 2
i = 1, j = 3
i = 2, j = 1
i = 2, j = 2
outerLoop exited
Langage du code : Dart (dart)
2. continue + label
Passer directement à l’itération suivante de la boucle externe
void main() {
outerLoop:
for (var i = 1; i <= 3; i++) {
for (var j = 1; j <= 3; j++) {
if (i == 2 && j == 2) {
continue outerLoop; // Ignorer tous les j restants pour i=2, passer à i=3
}
print('i = $i, j = $j');
}
}
}
Langage du code : Dart (dart)
Sortie :
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
Exemple 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');
}
Langage du code : PHP (php)
Résultat d’exécution
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
Ce mécanisme se comporte de manière similaire à l’instruction goto des autres langages de programmation.
Boucles Loops