Sabemos que podemos usar una if letdeclaración como una abreviatura para verificar un nulo opcional y luego desenvolverlo.
Sin embargo, quiero combinar eso con otra expresión usando el operador lógico AND &&.
Entonces, por ejemplo, aquí hago un encadenamiento opcional para desenvolver y, opcionalmente, bajar mi rootViewController a tabBarController. Pero en lugar de anidar declaraciones if, me gustaría combinarlas.
if let tabBarController = window!.rootViewController as? UITabBarController {
if tabBarController.viewControllers.count > 0 {
println("do stuff")
}
}
Donaciones combinadas:
if let tabBarController = window!.rootViewController as? UITabBarController &&
tabBarController.viewControllers.count > 0 {
println("do stuff")
}
}
Lo anterior da el error de compilación Uso del identificador no resuelto 'tabBarController'
Simplificando:
if let tabBarController = window!.rootViewController as? UITabBarController && true {
println("do stuff")
}
Esto da un error de compilación. El valor enlazado en un enlace condicional debe ser de tipo opcional . Después de haber intentado varias variaciones sintácticas, cada una da un error de compilación diferente. Todavía tengo que encontrar la combinación ganadora de orden y paréntesis.
Entonces, la pregunta es, ¿es posible y, de ser así, cuál es la sintaxis correcta?
Tenga en cuenta que quiero hacer esto con una ifdeclaración, no una switchdeclaración o un ?operador ternario .
fuente

var foo : Int? = 10; if let bar = foo { if bar == 10 { println("Great success!") }}if let bar = foo && bar == 10esUse of unresolved identifier "bar"(en el segundobar, por supuesto).bridgeToObjectiveCestá en la versión beta 5 (y posiblemente nunca fue diseñado para uso general). 2. De todos modos, existe unfirstmétodo en el tipo integrado de SwiftArray.Respuestas:
A partir de Swift 1.2, esto ahora es posible . Las notas de la versión beta de Swift 1.2 y Xcode 6.3 indican:
Con la declaración anterior, la sintaxis sería:
Esto usa la
wherecláusula.Otro ejemplo, esta vez lanzando
AnyObjectaInt, desenvolviendo el opcional y verificando que el opcional desenvuelto cumpla con la condición:Para aquellos que ahora usan Swift 3, "donde" ha sido reemplazado por una coma. Por tanto, el equivalente sería:
fuente
En Swift 3, el ejemplo de Max MacLeod se vería así:
El
wherefue reemplazado por,fuente
if letsólo puede continuar si la opción opcional se desenvuelve correctamente y se asigna al nuevo nombre de variable. Si lo dijerasOR <something else>, podrías omitir fácilmente todo el propósito delif let. Para OR lógico, simplemente haga uniftrato normal y dentro del cuerpo con el hecho de que el primer objeto todavía es opcional en ese punto (no desenvuelto).La respuesta de Max es correcta y una forma de hacerlo. Sin embargo, tenga en cuenta que cuando se escribe de esta manera:
if let a = someOptional where someBool { }La
someOptionalexpresión se resolverá primero. Si falla, lasomeBoolexpresión no se evaluará (evaluación de cortocircuito, como era de esperar).Si desea escribir esto al revés, puede hacerlo así:
if someBool, let a = someOptional { }En este caso
someBoolse evalúa primero, y solo si se evalúa como verdadero sesomeOptionalevalúa la expresión.fuente
Swift 4 , lo usaré,
fuente
No es posible.
De Swift grammar
if-condition debe ser expresión o declaración. No puedes tener tanto expresión como declaración.
let foo = bares una declaración, no se evalúa a un valor que se ajuste aBooleanType. Declara una constante / variablefoo.Su solución original es lo suficientemente buena, es mucho más legible que combinando las condiciones.
fuente
let foo = bares una declaración, no una expresión. no se puede hacerlet boolValue = (let foo = bar)Creo que tu propuesta original no es tan mala. Una alternativa (más complicada) sería:
fuente
tabBarControllernuevo