Est-il possible d'utiliser l'opérateur de plage ...
et ..<
avec l'instruction if. Maye quelque chose comme ça:
let statusCode = 204
if statusCode in 200 ..< 299 {
NSLog("Success")
}
la source
Est-il possible d'utiliser l'opérateur de plage ...
et ..<
avec l'instruction if. Maye quelque chose comme ça:
let statusCode = 204
if statusCode in 200 ..< 299 {
NSLog("Success")
}
Vous pouvez utiliser l'opérateur "pattern-match" ~=
:
if 200 ... 299 ~= statusCode {
print("success")
}
Ou une instruction switch avec un modèle d'expression (qui utilise l'opérateur de correspondance de modèle en interne):
switch statusCode {
case 200 ... 299:
print("success")
default:
print("failure")
}
Notez que ..<
dénote une plage qui omet la valeur supérieure, donc vous voulez probablement
200 ... 299
ou 200 ..< 300
.
Informations supplémentaires: Lorsque le code ci-dessus est compilé dans Xcode 6.3 avec les optimisations activées, alors pour le test
if 200 ... 299 ~= statusCode
en fait, aucun appel de fonction n'est généré du tout, seulement trois instructions d'assemblage:
addq $-200, %rdi
cmpq $99, %rdi
ja LBB0_1
c'est exactement le même code d'assemblage qui est généré pour
if statusCode >= 200 && statusCode <= 299
Vous pouvez vérifier cela avec
xcrun -sdk macosx swiftc -O -emit-assembly main.swift
À partir de Swift 2, cela peut s'écrire
if case 200 ... 299 = statusCode {
print("success")
}
en utilisant la mise en correspondance de modèles nouvellement introduite pour les instructions if. Voir aussi Swift 2 - Correspondance de motifs dans "if" .
func ~= (Range<A>, A) -> Bool
est appelée. Je suppose que cette fonction fonctionne avec O (1).xcrun -sdk macosx swift -emit-assembly main.swift
et inspecté le code assembleur. J'ai ensuite utiliséxcrun swift-demangle ...
pour démanteler le nom de la fonction appelée. - Malheureusement, Xcode ne peut pas encore créer de code d'assemblage pour les fichiers Swift, il fonctionnera peut-être dans une version ultérieure.Cette version semble être plus lisible que la correspondance de motifs:
la source
C'est un vieux fil, mais il me semble que nous y réfléchissons trop. Il me semble que la meilleure réponse est
Il n'y a pas
que je connais, et les autres solutions suggérées font des appels de fonction, qui sont plus difficiles à lire et peuvent être plus lents à exécuter. La méthode de correspondance de modèle est une astuce utile à connaître, mais semble être un mauvais ajustement pour ce problème.
Éditer:
Personnellement, je trouve que l'opérateur de correspondance de motifs est hideux et j'aimerais que le compilateur prenne en charge la
if x in 1...100
syntaxe. C'est tellement plus intuitif et facile à lire queif 1...100 ~= x
la source
if 200 ... 299 ~= statusCode
, aucun appel de fonction :)if 200 ... 299 ~= statusCode
Donne en fait le même code d'assemblage queif statusCode >= 200 && statusCode <= 299
Je voulais vérifier les erreurs 4xx sauf 401. Voici le code:
la source
J'ai également préféré l'opérateur Range .contains (), jusqu'à ce que je trouve que son implémentation est inefficace - https://oleb.net/blog/2015/09/swift-ranges-and-intervals/
la source