Swift étant semi fonctionnel il a apporté son lot de nouveauté dont l’ajout de nombreuses méthodes aux collections comme map
, flatMap
, forEach
, filter
etc. Quand on comprend comment utiliser ces méthodes on se rend vite compte que l’on peut écrire du code plus propre et plus concis. Cependant il est important de respecter certaines règles ou plutôt cas d’usage pour éviter d’écrire du code trop concis et donc incompréhensible. C’est ce que nous allons voir maintenant.
Map
La méthode map
, pour faire simple, transforme une valeur donnée en une autre valeur (par forcément de même type) en lui applicant la closure donnée en paramètre. Un cas d’usage recommandé est lorsque vous avez besoin de transformer une liste :
let listeDeNombre = [1, 2, 3, 4]
let listeDeString = listeDeNombre.map { String($0) }
Dans ce contexte, la fonction map
de Array
applique une méthode de transformation sur chacun des éléments et retourne une nouvelle liste avec ces résultats.
Map
a aussi l’avantage de pouvoir être chainé avec d’autre méthode ce qui permet d’écrire des choses puissante en très peu de ligne de code :
let results = mesImages
.map(couperEnCarre)
.map(augmenterLeContraste)
.map(appliquerInstagramEffet)
Boucle for-in vs forEach
Il y a quelques différences entre une boucle for-in
et la méthode forEach
des collections. Tout d’abord sachez que ceci est équivalent :
for nombre in listeDeNombre {
print(nombre)
}
// Equivalent à
listeDeNombre.forEach { print($0) }
En revanche on ne peut pas utiliser les déclarations break
ou continue
avec forEach
. La déclaration return
dans le corps de forEach
n’arrête pas son exécution :
listeDeNombre.forEach {
// invalide
break
// invalide
continue
// passe à l'élément suivant
return
}
Il est conseillé d’utiliser les boucles for-in
et forEach
quand il y a des effets de bord comme par example changer une variable, écrire sur le disque, mettre à jour l’interface graphique, etc.
FlapMap
FlatMap
permet de mettre à plat une liste de liste. C’est le cas d’utilisation principal de cette méthode :
let utilisateurs: [User] = ...
let tousLesEmails = utilisateurs.flatMap { $0.emails }
De la même manière que la boucle forEach
, si la méthode produit des effets de bord il vaut mieux utiliser une boucle for-in
:
for element in listeImbrique.flatten() {
ajouterALaTable(element)
}
Conclusion
Il revient à votre équipe de choisir la construction la plus appropriée en fonction de vos besoins. Il est toujours bon de respecter un certain nombre de convention pour faciliter la lecture et la compréhension du code. Par example si vous opté pour le forEach
les futurs développeurs sauront au premier coup d’oeil qu’il n’y aura pas d’effets de bord en dehors de la boucle.
Si vous avez des question, laissez un commentaire.
Bonjour, dans le second paragraphe de la section FlapMap, il est écrit « Quand le comme à besoin ». Je ne comprends pas ce début de phrase, je pense qu’il faudrait la reformuler (le mot « comme » est-il intrus ?). Je vous formule mes sincères encouragements pour la continuation de ce blog.
Merci encore une fois pour ces corrections. Il faudrait que je me relise un peu mieux pour éviter ce genre d’erreur.
Et puis merci pour vos encouragements. Si vous avez des sujets que vous voudriez que l’on traite sur ce blog, n’hésitez pas.