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.
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 ?
Oui en effet, le premier argument est bien de type C1. Merci pour cette correction.