Les extensions de protocole

L’arrivé de Swift 2 a amené son lot de nouveauté dont une très importante qui est la possibilité d’étendre les protocoles. L’extension des protocoles permet d’ajouter des nouvelles méthodes (la définition + l’implémentation) à n’importe quel classe. Comme d’habitude un petit example est plus parlant que de longue phrase.

L’example

Pour illustrer notre propos nous allons étendre les collections (Array, Dictionary, Set, etc.) afin d’ajouter une méthode qui nous permet de vérifier que tous les éléments de cette collection satisfont le prédicat donné. En Swift 1.2 ou avant nous aurions certainement dû écrire quelque chose comme ça :

extension Array {
  func all(test: (Generator.Element) -> Bool) -> Bool {
    for item in self {
      if !test(item) {
        return false
      }
    }

    return true
  }
}

Ici cela fonctionne bien, mais l’extension fonctionne uniquement pour les Array. Pour les Dictionary vous auriez dû écrire la même chose, et ainsi de suite pour chacune de vos collection. Heureusement en Swift 2 il est maintenant possible d’écrire le code une fois et qu’il s’applique à toute les collections. Pour ce faire rien de plus simple :

extension CollectionType {
  func all(test: (Generator.Element) -> Bool) -> Bool {
    for item in self {
      if !test(item) {
        return false
      }
    }

    return true
  }
}

Maintenant toute les collections existantes et celles que vous pourrez créer pourront utiliser cette méthode par défaut :

let a = [1, 2, 3, 4]
print(a.all { $0 > 0 }) // true

let b = ["un": 1, "deux": 2]
print(b.all { $0.1 > 0 }) // true
1 Etoile2 Etoiles3 Etoiles4 Etoiles5 Etoiles (1 votes, average: 5,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.