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.