utilizados suma potencias operadores swift expression

suma - swift 4 negation



Usando Swift si se lo permite con el operador AND lógico && (5)

A partir de Swift 1.2, esto ahora es posible . Las notas de lanzamiento de Swift 1.2 y Xcode 6.3 beta indican:

Desenvoltura opcional más potente con if let: la construcción if let ahora puede desenvolver múltiples opciones a la vez, así como también incluir condiciones booleanas intermedias. Esto le permite expresar el flujo de control condicional sin anidamiento innecesario.

Con la declaración anterior, la sintaxis sería entonces:

if let tabBarController = window!.rootViewController as? UITabBarController where tabBarController.viewControllers.count > 0 { println("do stuff") }

Esto usa la cláusula where .

Otro ejemplo, esta vez lanzando AnyObject a Int , desenvolviendo el opcional y comprobando que el paquete opcional desempaquetado cumple con la condición:

if let w = width as? Int where w < 500 { println("success!") }

Para aquellos que ahora usan Swift 3, "where" ha sido reemplazado por una coma. El equivalente sería por lo tanto:

if let w = width as? Int, w < 500 { println("success!") }

Sabemos que podemos usar una declaración if let como una abreviatura para verificar un nil opcional y luego desenvolver.

Sin embargo, quiero combinar eso con otra expresión usando el operador AND lógico && .

Así que, por ejemplo, aquí hago un encadenamiento opcional para desenvolver y, opcionalmente, reducir mi rootViewController a tabBarController. Pero en lugar de tener declaraciones if anidadas, 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 proporciona un error de compilación. El valor de enlace en un enlace condicional debe ser de tipo Opcional . Habiendo intentado varias variaciones sintácticas, cada una arroja 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, en caso afirmativo, cuál es la sintaxis correcta?

Tenga en cuenta que quiero hacer esto con una instrucción if y no con una declaración switch o un ternario ? operador.


Creo que su proposición original no es tan mala. Una alternativa (más desordenada) sería:

if ((window!.rootViewController as? UITabBarController)?.viewControllers.count ?? 0) > 0 { println("do stuff") }


En Swift 3, el ejemplo de Max MacLeod se vería así:

if let tabBarController = window!.rootViewController as? UITabBarController, tabBarController.viewControllers.count > 0 { println("do stuff") }

El where fue reemplazado por


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 expresión someOptional se resolverá primero. Si falla, la expresión someBool no se evaluará (evaluación de cortocircuito, como era de esperar).

Si quiere 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 se evalúa someOptional expresión someOptional .


No es posible.

De la gramática Swift

GRAMÁTICA DE UNA DECLARACIÓN IF

if-statement → if if-condition código-bloque else-clauseopt

si-condición → expresión | declaración

else-cláusula → else bloque de código | else if-statement

El valor de cualquier condición en una sentencia if debe tener un tipo que se ajuste al protocolo BooleanType. La condición también puede ser una declaración de enlace opcional, como se describe en Enlace opcional

if-condition debe ser expresión o declaración. No puedes tener expresión y declaración.

let foo = bar es una declaración, no evalúa a un valor que se ajuste a BooleanType . Declara un foo constante / variable.

Su solución original es lo suficientemente buena, es mucho más legible y luego combina las condiciones.