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...
Share on FacebookShare on Google+Tweet about this on TwitterShare on LinkedInPin on PinterestShare on RedditDigg this

Aucun commentaire

Time limit is exhausted. Please reload CAPTCHA.