Je connais les switch
instructions de Swift, mais je me demande comment remplacer ce morceau de code par un switch
:
if someVar < 0 {
// do something
} else if someVar == 0 {
// do something else
} else if someVar > 0 {
// etc
}
swift
switch-statement
Pieter
la source
la source
Réponses:
Voici une approche. En supposant que
someVar
c'est unInt
ou un autreComparable
, vous pouvez éventuellement affecter l'opérande à une nouvelle variable. Cela vous permet de l'étendre comme vous le souhaitez en utilisant lewhere
mot - clé:Cela peut être un peu simplifié:
Vous pouvez également éviter
where
complètement le mot - clé avec la correspondance de plage:la source
default: fatalError()
de détecter tôt les éventuelles erreurs de logique.assertionFailure
semble être une option plus sûre, en particulier lorsque vous travaillez en équipe.Avec Swift 5, vous pouvez choisir l'un des commutateurs suivants afin de remplacer votre instruction if.
# 1 Utilisation du commutateur avec
PartialRangeFrom
etPartialRangeUpTo
# 2 Utilisation du commutateur avec
ClosedRange
etRange
# 3 Utilisation de switch avec la clause where
# 4 Utilisation de commutateur avec clause where et affectation à
_
# 5 Utilisation du commutateur avec
RangeExpression
l'~=(_:_:)
opérateur du protocole# 6 Utilisation du commutateur avec
Equatable
l'~=(_:_:)
opérateur du protocole# 7 Utilisation de commutateur avec
PartialRangeFrom
,PartialRangeUpTo
etRangeExpression
de »contains(_:)
méthodela source
0.1
renvoie une erreur fatale car1...
ne couvre que les nombres à partir de 1. Cette solution ne fonctionne donc que sivalue
c'est unInt
mais c'est dangereux car si le type de variable change, la fonctionnalité est interrompue sans aucune erreur du compilateur.La
switch
déclaration, sous le capot, utilise l'~=
opérateur. Donc ça:Desugars à ceci:
Si vous regardez la référence de bibliothèque standard, elle peut vous dire exactement ce que le
~=
est surchargé à faire : inclus est la correspondance de plage, et l'équation pour des choses égales. (La correspondance enum-case n'est pas incluse, qui est une fonctionnalité de langage, plutôt qu'une fonction dans la bibliothèque std)Vous verrez qu'il ne correspond pas à un booléen droit sur le côté gauche. Pour ce genre de comparaisons, vous devez ajouter une instruction where.
Sauf si ... vous surchargez l'
~=
opérateur vous-même. (Ce n'est généralement pas recommandé) Une possibilité serait quelque chose comme ceci:Cela correspond donc à une fonction qui renvoie un booléen à gauche à son paramètre à droite. Voici le genre de chose pour laquelle vous pouvez l'utiliser:
Pour votre cas, vous pourriez avoir une déclaration qui ressemble à ceci:
Mais maintenant, vous devez définir de nouveaux
isNegative
etisPositive
fonctions. Sauf si vous surchargez plus d'opérateurs ...Vous pouvez surcharger les opérateurs d'infixe normaux pour qu'ils soient des opérateurs de préfixe curry ou de suffixe. Voici un exemple:
Cela fonctionnerait comme ceci:
Combinez cela avec la fonction précédente, et votre instruction switch peut ressembler à ceci:
Maintenant, vous ne devriez probablement pas utiliser ce genre de chose dans la pratique: c'est un peu douteux. Vous feriez (probablement) mieux de vous en tenir à la
where
déclaration. Cela dit, le modèle d'instruction switch deou
Cela semble assez courant pour que cela vaille la peine d'être considéré.
la source
Vous pouvez:
la source
Puisque quelqu'un a déjà posté
case let x where x < 0:
ici, c'est une alternative pour oùsomeVar
est un fichierInt
.Et voici une alternative pour où
someVar
est unDouble
:la source
Voici à quoi ça ressemble avec les gammes
la source
L'
<0
expression ne fonctionne pas (plus?) Alors j'ai fini avec ceci:Swift 3.0:
la source
X_MAX
a été remplacé par.greatestFiniteMagnitude
, c'est-à-direDouble.greatestFiniteMagnitude
,CGFloat.greatestFiniteMagnitude
etc. Donc, généralement, vous pouvez le fairecase 0..< .greatestFiniteMagnitude
puisque le type desomeVar
est déjà connuvar timeLeft = 100
switch timeLeft {case 0...<=7200: print("ok") default:print("nothing") }
Pourquoi l'<=
opérateur n'est-il pas reconnu? Si je l'écris sans égal, cela fonctionne. Mercicase 0...7200:
L'opérateur<=
est un opérateur de comparaison. Dans un commutateur, vous ne pouvez utiliser que des opérateurs de plage (voir la documentation)someVar
unInt
et je devais faireDouble(
someVar) `pour le faire fonctionner ...Heureux que Swift 4 résout le problème:
Comme solution de contournement dans 3, j'ai fait:
Fonctionne mais pas idéal
la source