Méthode forEach

Parcourez chaque élément de vos collections de manière simple et intuitive, sans avoir à gérer les index ou les conditions de boucle.

Voir sur YouTube

En Swift, la méthode forEach est une alternative à la boucle for-in qui permet d'itérer sur chaque élément d'une collection comme un tableau, un ensemble ou un dictionnaire. La méthode forEach est souvent utilisée pour écrire du code plus concis et pour intégrer des éléments fonctionnels dans votre code.

Syntaxe de forEach

La méthode forEach prend une closure (ou une fonction anonyme) comme argument, et cette closure est appelée une fois pour chaque élément de la collection.

collection.forEach { item in
    // Code à exécuter pour chaque item
}
  • collection : La collection que vous souhaitez parcourir (tableau, dictionnaire, ensemble, etc.).
  • item : Représente chaque élément de la collection lors de chaque itération.

Utilisation avec un Tableau

let fruits = ["Pomme", "Banane", "Cerise"]
fruits.forEach { fruit in
    print(fruit)
}
// Affiche :
// Pomme
// Banane
// Cerise

Dans cet exemple, chaque élément du tableau fruits est passé dans la closure, où il est imprimé.

Utilisation avec un Ensemble

Les ensembles (sets) n'ont pas d'ordre particulier, mais forEach peut être utilisé pour itérer sur tous les éléments d'un ensemble.

let numbers: Set = [1, 2, 3, 4, 5]
numbers.forEach { number in
    print(number)
}
// Affiche les nombres dans un ordre indéfini, par exemple :
// 1
// 2
// 3
// 4
// 5

Utilisation avec un Dictionnaire

Lors de l'utilisation de forEach avec un dictionnaire, vous recevez un tuple (clé, valeur) pour chaque entrée.

let ages = ["Alice": 30, "Bob": 25, "Charlie": 35]
ages.forEach { (name, age) in
    print("\(name) a \(age) ans")
}
// Affiche :
// Alice a 30 ans
// Bob a 25 ans
// Charlie a 35 ans

Différences entre forEach et for-in

  • Style Fonctionnel : forEach est plus orienté fonctionnel, ce qui le rend souvent plus concis et peut s'intégrer plus naturellement dans du code qui utilise d'autres concepts de programmation fonctionnelle comme les fermetures (closures) et les méthodes de transformation (map, filter, etc.).
  • Impossibilité d'utiliser break ou continue : Contrairement à la boucle for-in, vous ne pouvez pas utiliser les instructions break ou continue dans une boucle forEach. Si vous avez besoin de sortir prématurément de la boucle ou de passer à l'itération suivante, forEach n'est pas la bonne méthode à utiliser.
let numbers = [1, 2, 3, 4, 5]

for number in numbers {
    if number == 3 {
        break
    }
    print(number)
}
// Affiche :
// 1
// 2

Le même code avec forEach entraînerait une erreur si vous essayez d'utiliser break ou continue :

numbers.forEach { number in
    if number == 3 {
        // break  // Erreur : 'break' n'est pas permis dans une closure
    }
    print(number)
}

Exemples Avancés

Utilisation avec une Closure Inline

Vous pouvez simplifier encore plus votre code en utilisant une closure inline si le code exécuté pour chaque élément est court.

let numbers = [1, 2, 3, 4, 5]
numbers.forEach { print($0) }
// Affiche :
// 1
// 2
// 3
// 4
// 5
  • $0 : Représente le premier argument de la closure. Dans le cas de forEach, il s'agit de l'élément de la collection.

Utilisation avec une Fonction Externe

Vous pouvez également passer une fonction existante à forEach.

func printElement(_ element: Int) {
    print("Élément : \(element)")
}
let numbers = [10, 20, 30]
numbers.forEach(printElement)
// Affiche :
// Élément : 10
// Élément : 20
// Élément : 30

Quand Utiliser forEach ?

  • Code Concis et Lisible : forEach est particulièrement utile lorsque vous souhaitez écrire des boucles courtes et directes, où le focus est sur l'exécution d'une tâche simple pour chaque élément d'une collection.
  • Programmation Fonctionnelle : Si vous utilisez un style de programmation fonctionnelle dans votre code Swift, forEach s'intègre bien avec d'autres méthodes de transformation de collections.
  • Absence de Besoin de Contrôle de Flux : Si vous n'avez pas besoin de sauter des itérations (continue) ou de sortir de la boucle prématurément (break), forEach est une bonne option.