À 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 est Use of unresolved identifier "bar" (sur la deuxième bar, 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 un first méthode de Swift, intégré dans Array type de toute façon.
  • excellent merci!

InformationsquelleAutor Max MacLeod | 2014-08-08