Comment utiliser le mot-clé « where » en Swift ?

Swift a introduit dès le départ le mot-clé where avec les instructions switch/case et if afin d’ajouter un peu plus de control dans les flux. Cependant depuis Swift 2, where peut être utiliser presque partout. Nous allons lister ici la majorité des cas où where peut être utile :

For-in

let arr = [1, 2, 3, 4]
let dict = [1:"un", 2:"deux"]

for num in array where dict[num] != nil {
  // 1, 2
}

Do-catch

enum ResponseError: ErrorType {
  case HTTP(Int)
}

func errorProne() throws {
  throw ResponseError.HTTP(404)
}

do {
  try errorProne()
}
catch ResponseError.HTTP(let code) where code >= 400 && code % 2 == 0 {
  print("Mauvais requête") // match
}
catch ResponseError.HTTP(let code) where code >= 500 && code < 600 {
  print("Erreur interne du serveur")
}

While

var mutableArray: [Int] = []

while let arr = mutableArray where arr.count < 5 {
  mutableArray.append(0)
}

print(mutableArray) // [0, 0, 0, 0, 0]

If-else

let string: String? = "Échec et mat"

if let str = string where str == "Échec et mat" {
  print("jeu terminé") // match
}
else {
  print("jouons")
}

Guard

let string: String? = ""Échec et mat"

guard let str = string where str != ""Échec et mat" else {
  fatalError("jeu terminé") // match
}
print("jouons")

Switch-case

var value = (1,2)

switch value {
case let (x, y) where x == 1:
  // égal à 1
  break
case let (x, y) where x / 5 == 1:
  // non égal à 1
  break
default:
  break
}

Type constraint

func allItemsMatch<
  C1: Container, C2: Container
  where C1.ItemType == C2.ItemType, C1.ItemType: Equatable
  >(someContainer: C1, _ anotherContainer: C2) -> Bool {
    // ...
}

Cette fonction prend deux arguments : someContainer et anotherContainer. Le premier est de type C1, tandis que le deuxième est de type C2. Ces deux paramètres de types sont tous les deux de type Container.

Mais ici le plus important c’est la clause where qui permet de préciser les contraintes des deux paramètres qui sont les suivantes :

  • Les éléments de someContainer sont conforme au protocol Equatable.
  • someContainer et anotherContainer et contiennent le même type d’éléments.

Conclusion

Bien sur, la clause where fait parti du langage Swift et peut être utiliser presque n’importe où. Maintenant à vous de voir comment l’utiliser au mieux dans votre code.

Merci à Marcin Krzyżanowski pour avoir listé toute ces possibilités.

1 Etoile2 Etoiles3 Etoiles4 Etoiles5 Etoiles (3 votes, average: 5,00 out of 5)

Loading...

2 commentaires

Annuler

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.

  1. quark67 · 26 janvier 2016

    Bonjour, merci pour ce blog. Dans le paragraphe « Type constraint » il est marqué : « Le premier est de type C2, tandis que le deuxième est de type C2. ». Je suppose qu’il fallait lire : « Le premier est de type C1 », non ?

    • yannickl · 26 janvier 2016

      Oui en effet, le premier argument est bien de type C1. Merci pour cette correction.