À l'aide de la Swift si laisser avec logique ET l'opérateur &&
Nous savons que nous pouvons utiliser un if let
déclaration comme une abréviation pour vérifier la présence d'une option néant ensuite déballer.
Cependant, je tiens à combiner avec une autre expression à l'aide de la logique ET de l'opérateur &&
.
Ainsi, par exemple, ici, je ne facultatif chaînage de les déballer et éventuellement abattu mon rootViewController à tabBarController. Mais plutôt que d'avoir des instructions if imbriquées, je tiens à combiner.
if let tabBarController = window!.rootViewController as? UITabBarController {
if tabBarController.viewControllers.count > 0 {
println("do stuff")
}
}
Combiné donnant:
if let tabBarController = window!.rootViewController as? UITabBarController &&
tabBarController.viewControllers.count > 0 {
println("do stuff")
}
}
Ci-dessus donne l'erreur de compilation Utilisation de suspens identificateur 'tabBarController'
Simplification:
if let tabBarController = window!.rootViewController as? UITabBarController && true {
println("do stuff")
}
Cela donne une erreur de compilation valeur Liée à un conditionnel, la liaison doit être de type Facultatif. Après avoir essayé diverses variations syntaxiques, chacun donne une autre erreur du compilateur. Je n'ai pas encore trouver la combinaison gagnante de l'ordre et de parenthèses.
Donc la question est, est-il possible et si oui quel est la syntaxe correcte?
Remarque que je veux faire avec un if
déclaration pas un switch
déclaration ou un ternaire ?
opérateur.
- C'est toujours une bonne idée de fournir les messages d'erreur dans la question.
- Plus simple déclaration pour les gens qui aiment à expérimenter avec cette:
var foo : Int? = 10; if let bar = foo { if bar == 10 { println("Great success!") }}
- Le message d'erreur lors de l'utilisation de
if let bar = foo && bar == 10
estUse of unresolved identifier "bar"
(sur la deuxièmebar
, bien sûr). - ajoutée, à la demande
- juste une remarque que j'ai été en mesure de réduire l'exemple ci-dessus à l'aide de l'Objectif C est firstObject comme suit: si le laisser navigationController = tabBarController.viewControllers.bridgeToObjectiveC().firstObject comme? UINavigationController {
- 1.
bridgeToObjectiveC
est passé en beta 5 (et a peut-être été jamais prévu pour un usage général). 2. Il y a unfirst
méthode de Swift, intégré dansArray
type de toute façon. - excellent merci!
Vous devez vous connecter pour publier un commentaire.
De Swift 1.2, cette est maintenant possible. Le Swift 1.2 et Xcode 6.3, la version bêta de notes état:
Avec la déclaration ci-dessus, la syntaxe serait alors:
Il utilise le
where
clause.Un autre exemple, cette fois-casting
AnyObject
àInt
, ôter l'option, et en vérifiant que la déballé en option satisfait à la condition:Pour ceux qui sont maintenant en utilisant Swift 3, "où", a été remplacé par une virgule. L'équivalent serait donc:
Dans Swift 3 Max MacLeod exemple ressemble à ceci:
La
where
a été remplacé par,
if let
ne peut se faire que si l'option avec succès déballé et est affecté au nouveau nom de la variable. Si vous avez ditOR <something else>
ensuite, vous pouvez facilement contourner le but de l'if let
. Un point de vue logique, il suffit de faire une normalif
et à l'intérieur du corps composer avec le fait que le premier objet est toujours facultative à point (pas déballé).Max la réponse est correcte et une façon de le faire. Notez bien que lorsqu'il est écrit de cette façon:
if let a = someOptional where someBool { }
La
someOptional
expression est résolu en premier. Si elle échoue, alors lesomeBool
expression ne sera pas évalué (court-circuit d'évaluation, que vous attendez).Si vous voulez écrire cela dans l'autre sens, il peut être fait comme suit:
if someBool, let a = someOptional { }
Dans ce cas
someBool
est évalué en premier, et seulement si elle est true est lasomeOptional
expression évaluée.Il n'est pas possible.
De Swift grammaire
si la condition doit être l'expression ou déclaration. Vous ne pouvez pas avoir à la fois l'expression et de la déclaration.
let foo = bar
est une déclaration, il n'est pas évalué à une valeur conforme àBooleanType
. Il déclare une constante/variable defoo
.Votre solution originale est assez bon, il est beaucoup plus lisible puis de combiner les conditions.
let boolValue = (let foo = bar)
Swift 4, je vais utiliser,
Je pense que votre proposition d'origine n'est pas trop mauvais. Un (messier) alternative serait:
tabBarController
de nouveau