Sabemos que podemos usar una if let
declaració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 if
declaración, no una switch
declaració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 == 10
esUse of unresolved identifier "bar"
(en el segundobar
, por supuesto).bridgeToObjectiveC
está en la versión beta 5 (y posiblemente nunca fue diseñado para uso general). 2. De todos modos, existe unfirst
mé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
where
cláusula.Otro ejemplo, esta vez lanzando
AnyObject
aInt
, 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
where
fue reemplazado por,
fuente
if let
só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 unif
trato 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
someOptional
expresión se resolverá primero. Si falla, lasomeBool
expresió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
someBool
se evalúa primero, y solo si se evalúa como verdadero sesomeOptional
evalú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 = bar
es 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 = bar
es 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
tabBarController
nuevo