Quand utiliser map, flatMap, forEach ou les boucles for-in en Swift ?

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.

1 Etoile2 Etoiles3 Etoiles4 Etoiles5 Etoiles (1 votes, average: 5,00 out of 5)
Loading...
Share on FacebookShare on Google+Tweet about this on TwitterShare on LinkedInPin on PinterestShare on RedditDigg this

2 commentaires

Time limit is exhausted. Please reload CAPTCHA.

  1. quark67 · 6 février 2016

    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.

    • yannickl · 6 février 2016

      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.