Nous savons que nous pouvons utiliser un if let
instruction comme raccourci pour vérifier un nil facultatif, puis déballer.
Cependant, je veux combiner cela avec une autre expression utilisant l'opérateur logique AND &&
.
Ainsi, par exemple, je fais ici un chaînage facultatif pour dérouler et éventuellement abaisser mon rootViewController vers tabBarController. Mais plutôt que d'avoir des instructions if imbriquées, j'aimerais les combiner.
if let tabBarController = window!.rootViewController as? UITabBarController {
if tabBarController.viewControllers.count > 0 {
println("do stuff")
}
}
Dons combinés:
if let tabBarController = window!.rootViewController as? UITabBarController &&
tabBarController.viewControllers.count > 0 {
println("do stuff")
}
}
Ce qui précède donne l'erreur de compilation Utilisation de l'identificateur non résolu 'tabBarController'
Simplifier:
if let tabBarController = window!.rootViewController as? UITabBarController && true {
println("do stuff")
}
Cela donne une erreur de compilation La valeur liée dans une liaison conditionnelle doit être de type facultatif . Après avoir tenté diverses variations syntaxiques, chacune donne une erreur de compilation différente. Je n'ai pas encore trouvé la combinaison gagnante d'ordre et de parenthèses.
Alors, la question est, est-ce possible et si oui quelle est la syntaxe correcte?
Notez que je veux faire cela avec une if
instruction et non une switch
instruction ou un ?
opérateur ternaire .
la source
var foo : Int? = 10; if let bar = foo { if bar == 10 { println("Great success!") }}
if let bar = foo && bar == 10
estUse of unresolved identifier "bar"
(sur le secondbar
, bien sûr).bridgeToObjectiveC
est parti dans la bêta 5 (et n'a probablement jamais été destiné à un usage général). 2. Il existe de toute façon unefirst
méthode sur le type intégré de SwiftArray
.Réponses:
Depuis Swift 1.2, c'est désormais possible . Les notes de version bêta de Swift 1.2 et Xcode 6.3 indiquent:
Avec la déclaration ci-dessus, la syntaxe serait alors:
Cela utilise la
where
clause.Un autre exemple, cette fois-ci, transtyper
AnyObject
versInt
, déballer l'option et vérifier que l'option non emballée remplit la condition:Pour ceux qui utilisent maintenant Swift 3, "où" a été remplacé par une virgule. L'équivalent serait donc:
la source
Dans l'exemple de Swift 3 Max MacLeod ressemblerait à ceci:
Le a
where
été remplacé par,
la source
if let
ne peut continuer que si l'option facultative a été déroulée avec succès et est affectée au nouveau nom de variable. Si vous l'avez dit,OR <something else>
vous pourriez facilement contourner l'objectif général duif let
. Pour un OU logique, faites simplement un normalif
et à l'intérieur du corps, gérez le fait que le premier objet est toujours optionnel à ce stade (non déballé).La réponse de Max est correcte et constitue une façon de le faire. Notez cependant que lorsqu'il est écrit de cette façon:
if let a = someOptional where someBool { }
L'
someOptional
expression sera résolue en premier. En cas d'échec, lesomeBool
expression ne sera pas évaluée (évaluation de court-circuit, comme vous vous en doutez).Si vous voulez écrire ceci dans l'autre sens, vous pouvez le faire comme ceci:
if someBool, let a = someOptional { }
Dans ce cas, elle
someBool
est évaluée en premier et ce n'est que si elle est évaluée à vrai que l'someOptional
expression est évaluée.la source
Swift 4 , je vais utiliser,
la source
Ce n'est pas possible.
De la grammaire Swift
if-condition doit être une expression ou une déclaration. Vous ne pouvez pas avoir à la fois une expression et une déclaration.
let foo = bar
est une déclaration, elle n'évalue pas à une valeur conforme àBooleanType
. Il déclare une constante / variablefoo
.Votre solution originale est assez bonne, elle est beaucoup plus lisible que la combinaison des conditions.
la source
let foo = bar
est une déclaration et non une expression. vous ne pouvez pas fairelet boolValue = (let foo = bar)
Je pense que votre proposition initiale n'est pas trop mauvaise. Une alternative (plus désordonnée) serait:
la source
tabBarController
nouveau