De vérifier la valeur d'une Option de Bool
Quand je veux vérifier si une Option Booléenne est vraie, cela ne fonctionne pas:
var boolean : Bool? = false
if boolean{
}
Il en résulte cette erreur:
Option de type '@IvalueBool? " ne peut pas être utilisé comme un booléen; test pour '!= nil"
au lieu de cela
Je ne veux pas vérifier pour les nuls; je veux vérifier si la valeur renvoyée est true.
Dois-je toujours faire if boolean == true
si je travaille avec une Option de Bool?
Depuis Options ne sont pas conformes à BooleanType
plus, ne pas le compilateur sache que je tiens à vérifier la valeur du Booléen?
- Depuis les Booléens sont conformes à la Equatable protocole, alors vous pouvez comparer une option pour un non optionnel. Voir here
Vous devez vous connecter pour publier un commentaire.
Avec, en option, des booléens, il est nécessaire de faire le chèque explicite:
Sinon, vous pouvez déballer l'option:
Mais qui génère une exception d'exécution si le booléen est
nil
- pour éviter que:Avant de bêta 5, il a été possible, mais il a été modifié comme indiqué dans les notes de version:
Addendum: comme suggéré par @MartinR, plus compact de la variation à la 3ème option est à l'aide de la coalescence de l'opérateur:
ce qui signifie: si le booléen est pas nulle, l'expression renvoie la valeur booléenne (c'est à dire à l'aide de la déballé valeur booléenne), sinon l'expression est évaluée à
false
if let
serait aussi travailler.let
n'est pas aussi bon, parce qu'il vous indique si l'option a une valeur ou pas - vous devez ajouter un si imbriquées afin de vérifier si la déballé est vrai ou pasif boolean ?? false { ... }
.if !(boolean ?? true) { ... }
🙁if case .some(true) = boolean { ... }
De fixation en option
Swift 3 & 4
Swift 2.2
Le code
let booleanValue = booleanValue
retournefalse
sibooleanValue
estnil
et laif
bloc n'est pas exécutée. SibooleanValue
n'est pasnil
, ce code définit une nouvelle variable nomméebooleanValue
de typeBool
(au lieu d'une option,Bool?
).La Swift 3 & 4 code
booleanValue
(et Swift 2.2 codewhere booleanValue
) évalue les nouvellesbooleanValue: Bool
variable. Si c'est vrai, laif
bloc s'exécute avec la nouvelle définition desbooleanValue: Bool
variable dans la portée (permettant l'option de référence de la valeur liée à nouveau dans leif
bloc).Note: C'est une Swift convention de nom lié à la constante/variable de la même que l'option de la constante/variable comme
let booleanValue = booleanValue
. Cette technique est appelée variable ombrage. Vous pourriez pause de la convention et d'utiliser quelque chose commelet unwrappedBooleanValue = booleanValue, unwrappedBooleanValue
. Je souligne cela pour aider à comprendre ce qui se passe. Je recommande d'utiliser la variable d'ombrage.D'Autres Approches
Néant coalescence
Néant coalescence est clair pour ce cas précis
La vérification de
false
n'est pas aussi claireRemarque:
if !booleanValue ?? false
ne compile pas.Force déballage en option (à éviter)
Force d'ôter augmente les chances que quelqu'un va faire un changement dans l'avenir qui compile mais se bloque au moment de l'exécution. Donc, je voudrais éviter de quelque chose comme ceci:
Une Approche Générale
Si ce débordement de pile question demande précisément comment vérifier si un
Bool?
esttrue
au sein d'uneif
déclaration, il est utile de définir une approche générale de savoir si la vérification de vrai, faux ou la combinaison de la déballé valeur avec d'autres expressions.Comme l'expression devient plus compliqué, je trouve l'option liaison approche plus souple et plus facile à comprendre que les autres approches. Notez que l'option de liaison fonctionne avec n'importe quel type facultatif (
Int?
,String?
, etc.).if let
?while array.last < threshold { array.removeLast() }
if, let, where
en utilisant ceci:while let last = array.last where last < threshold { array.removeLast() }
dans Swift 2 ouwhile let last = array.last, last < threshold { array.removeLast() }
dans Swift 3.while let
.var optionalBool :Bool? = false; if (optionalBool == false){ print("is false"); }
n'a pas besoin de tout déballer...Equatable
protocole, alors, vous pouvez comparer une option pour un non optionnel. Voir iciif optionalBool == false { ...
fonctionne, mais il est incompatible avec la convention pour l'évaluation d'un non-optionnel qui est comme ceif nonOptionalBool { ...
. Je préfère l'approche qui correspond à la norme Swift conventions de codage, mais il ya beaucoup d'approches qui fonctionnent dans ce cas.J'ai trouvé une autre solution, la surcharge d'opérateurs Booléens. Par exemple:
Cela peut ne pas être totalement dans "l'esprit" de la langue, mais cela permet pour la sécurité déballage des options, et il est utilisable pour des instructions conditionnelles n'importe où, y compris lors de la boucle.