Le pattern Itérateur en Swift

Aujourd’hui nous allons parler du design pattern itérateur (iterator en anglais). Un itérateur fournit une interface standard pour parcourir une collection d’élément d’un objet, sans avoir la nécessité de comprendre sa structure sous-jacente.

Pour commencer imaginons que nous ayons une collection de CD. Maintenant créons l’objet (ici une structure) représentant un CD :

struct CD {
  let name: String
  let artist: String
  let songCount: Int
}

Ensuite définissons un objet qui contient tous les CDs avec des uniquement des musiques des années 80 :

class CollectionCD80 {
  private var cds: [CD] = // Une liste de CD
}

Afin de parcourir cette collection des années 80 nous allons utiliser le pattern itérateur :

extension CollectionCD80: SequenceType {
  typealias Generator = AnyGenerator

  func generate() -> AnyGenerator {
    var i = 0

    return anyGenerator {
      switch i {
      case 0 ..< self.cds.count:
        let cd = self.cds[i]
        i      += 1

        return cd
      default:
        return nil
      }
    }
  }
}

En swift il existe un protocol très utile pour créer un itérateur : SequenceType. Tout objet se conformant à ce protocol doit définir un alias appelé Generator qui permet de connaitre le type d’élément qui sera retourner lors du parcours de notre liste. Pour finir la fonction generate définit le comportement de notre itérateur en choisissant la manière dont les éléments sont retournés. Ici nous retournons les éléments se trouvant dans la liste cds dans l’ordre d’apparition.

Il ne nous reste plus qu’a lister l’ensemble de nos cds des années 80 et pour cela rien de plus simple : l’utilisation d’une boucle for-in directement sur la collection !

let cdsAnnees80 = CollectionCD80()

for cd in cdsAnnees80 {
  print(cd)
}

Voilà ! Le fait d’avoir transformer notre collection des années 80 en itérateur nous permet maintenant de la parcourir directement sans passer par sa propriété (qui est privée).

Pour allez plus loin

Si vous souhaitez en savoir plus sur ce patron de conception vous pouvez jetez un coup d’oeil sur wikipédia pour comparer avec d’autres languages.

À bientôt pour de nouvelles aventures.

1 Etoile2 Etoiles3 Etoiles4 Etoiles5 Etoiles (2 votes, average: 4,00 out of 5)
Loading...

Aucun commentaire

Time limit is exhausted. Please reload CAPTCHA.

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.