Swift 2 introdujo la guard
palabra clave, que podría usarse para garantizar que varios datos estén configurados listos para usar. Un ejemplo que vi en este sitio web demuestra una función submitTapped:
func submitTapped() {
guard username.text.characters.count > 0 else {
return
}
print("All good")
}
Me pregunto si usar guard
es diferente a hacerlo a la antigua usanza de una if
condición. ¿Ofrece beneficios que no podría obtener con un simple cheque?
swift2
guard-statement
David Snabel
fuente
fuente
Respuestas:
Al leer este artículo , noté grandes beneficios al usar Guard
Aquí puede comparar el uso de guardia con un ejemplo:
Esta es la parte sin guardia:
Aquí está poniendo su código deseado dentro de todas las condiciones
Es posible que no vea inmediatamente un problema con esto, pero podría imaginar cuán confuso podría llegar a ser si estuviera anidado con numerosas condiciones que todas debían cumplirse antes de ejecutar sus declaraciones
La forma de limpiar esto es hacer primero cada uno de sus controles y salir si no se cumple alguno. Esto permite comprender fácilmente qué condiciones harán que esta función salga.
Pero ahora podemos usar guardia y podemos ver que es posible resolver algunos problemas:
Este mismo patrón también es válido para valores no opcionales:
Si todavía tiene alguna pregunta, puede leer el artículo completo: Declaración de Swift Guard.
Terminando
Y finalmente, leyendo y probando, descubrí que si usas guardia para desenvolver cualquier opción,
.
Aquí el valor sin envolver estaría disponible solo dentro del bloque if
fuente
let x = x where x > 0
¿Significa que ha acoplado otra condición en su enlace opcional? Quiero decir, es un poco diferente deif let constantName = someOptional { statements }
A diferencia
if
,guard
crea la variable a la que se puede acceder desde fuera de su bloque. Es útil desenvolver muchosOptional
s.fuente
Realmente hay dos grandes beneficios para
guard
. Una es evitar la pirámide de la fatalidad, como han mencionado otros, muchasif let
declaraciones molestas anidadas una dentro de la otra que se mueven cada vez más hacia la derecha.El otro beneficio es a menudo que la lógica que desea implementar es más "
if not let
” que "if let { } else
".Aquí hay un ejemplo: suponga que desea implementar
accumulate
: un cruce entremap
yreduce
donde le devuelve una serie de reducciones en ejecución . Aquí está conguard
:¿Cómo lo escribirías sin protección, pero aún usando
first
eso devuelve un opcional? Algo como esto:El anidamiento adicional es molesto, pero tampoco es tan lógico tener el
if
yelse
tan lejos. Es mucho más legible tener la salida anticipada para el caso vacío, y luego continuar con el resto de la función como si eso no fuera una posibilidad.fuente
Cuando se cumple una condición usando
guard
, expone las variables declaradas dentro delguard
bloque al resto del bloque de código, llevándolas a su alcance. Lo cual, como se dijo anteriormente, sin duda será útil conif let
declaraciones anidadas .Tenga en cuenta que el guardia requiere una devolución o un lanzamiento en su declaración else.
Analizando JSON con Guard
A continuación se muestra un ejemplo de cómo se puede analizar un objeto JSON usando guard en lugar de if-let. Este es un extracto de una entrada de blog que incluye un archivo de juegos que puedes encontrar aquí:
Cómo usar Guard en Swift 2 para analizar JSON
descargar juegos infantiles: juegos infantiles
Más información:
Aquí hay un extracto de la Guía del lenguaje de programación Swift:
fuente
Un beneficio es la eliminación de muchas
if let
declaraciones anidadas . Vea el video de WWDC "What's New in Swift" alrededor de las 15:30, la sección titulada "Pyramid of Doom".fuente
Cuando usar guardias
Si tiene un controlador de vista con algunos elementos UITextField o algún otro tipo de entrada de usuario, notará inmediatamente que debe desenvolver el textField.text opcional para acceder al texto (¡si lo hay!). isEmpty no le hará ningún bien aquí, sin ninguna entrada, el campo de texto simplemente devolverá nil.
Entonces, tiene algunos de estos que desenvuelve y finalmente pasa a una función que los publica en un punto final del servidor. No queremos que el código del servidor tenga que tratar con valores nulos o enviar por error valores no válidos al servidor, por lo que primero desenvolveremos esos valores de entrada con guardia.
Notará que nuestra función de comunicación del servidor toma valores de cadena no opcionales como parámetros, por lo tanto, la protección se desenvuelve de antemano. El desenvolvimiento es un poco intuitivo porque estamos acostumbrados a desenvolver si se deja que desenvuelva los valores para usar dentro de un bloque. Aquí, la declaración de protección tiene un bloque asociado, pero en realidad es un bloque else, es decir, lo que se hace si falla el desenvolvimiento: los valores se desenvuelven directamente en el mismo contexto que la declaración en sí.
// separación de intereses
Sin guardia
Sin usar guardia, terminaríamos con una gran pila de código que se asemeja a una pirámide de fatalidad . Esto no se escala bien para agregar nuevos campos a nuestro formulario o crear un código muy legible. La sangría puede ser difícil de seguir, particularmente con tantas otras declaraciones en cada bifurcación.
Sí, incluso podríamos combinar todo esto si dejamos declaraciones en una sola declaración separada por comas, pero perderíamos la capacidad de descubrir qué declaración falló y presentar un mensaje al usuario.
https://thatthinginswift.com/guard-statement-swift/
fuente
Con el uso de guardia nuestra intención es clara. no queremos ejecutar el resto del código si esa condición particular no se cumple. aquí también podemos extender la cadena, consulte el siguiente código:
fuente
Declaración de guardia va a hacer. es un par de diferentes
1) me permite reducir la declaración anidada if
2) es aumentar mi alcance que mi variable accesible
si la declaración
Declaración de guardia
fuente
Declaración de guardia
Se utiliza una declaración de guardia para transferir el control del programa fuera de un alcance si no se cumplen una o más condiciones.
Synatx:
Ventaja:
1. Al usar la
guard
declaración podemos deshacernos de condicionales profundamente anidados cuyo único propósito es validar un conjunto de requisitos.2. Fue diseñado específicamente para salir temprano de un método o función.
si usa si se deja a continuación es el código cómo se ve
Con la protección, puede transferir el control fuera de alcance si no se cumplen una o más condiciones.
Referencia:
1. Swift 2: Salga temprano con guardia 2. Udacity 3. Declaración de guardia
fuente
if condition { return }
¿hosco?Al igual que una declaración if, guard ejecuta declaraciones basadas en un valor booleano de una expresión. A diferencia de una declaración if, las declaraciones de guardia solo se ejecutan si no se cumplen las condiciones. Puede pensar en la guardia más como una Afirmación, pero en lugar de estrellarse, puede salir con gracia.
consulte: http://ericcerney.com/swift-guard-statement/
fuente
Realmente hace que el flujo de una secuencia con varias búsquedas y opciones sea mucho más conciso y claro, y reduce mucho si se anida. Vea la publicación de Erica Sadun sobre el reemplazo de Ifs . .... Podría dejarse llevar, un ejemplo a continuación:
A ver si eso se pega.
fuente
En pocas palabras, proporciona una forma de validar los campos antes de la ejecución. Este es un buen estilo de programación, ya que mejora la legibilidad. En otros idiomas, puede verse así:
Pero debido a que Swift le ofrece opciones, no podemos verificar si es nulo y asignar su valor a una variable. Por el contrario,
if let
verifica que no sea nulo y asigna una variable para mantener el valor real. Aquí es dondeguard
entra en juego. Le brinda una forma más concisa de salir temprano utilizando opciones.fuente
Fuente: Guardia en Swift
Veamos el ejemplo para entenderlo claramente
Ejemplo 1:
En el ejemplo anterior, vemos que 3 es mayor que 2 y se omite la declaración dentro de la cláusula guard else y se imprime True.
Ejemplo 2
En el ejemplo anterior, vemos que 1 es menor que 2 y la declaración dentro de la cláusula guard else se ejecuta y False se imprime seguido de return.
En el ejemplo anterior, estamos usando guard let para desenvolver los opcionales. En la función getName hemos definido una variable de tipo string myName que es opcional. Luego usamos guard let para verificar si la variable myName es nula o no, si no se asigna a name y verificamos nuevamente, name no está vacío. Si ambas condiciones califican, es decir, verdadero, el bloque else se omitirá e imprimirá "Las condiciones se cumplen con el nombre".
Básicamente, estamos verificando dos cosas separadas por comas, primero desenvolviendo y opcionales, y verificando si eso satisface la condición o no.
Aquí no estamos pasando nada a la función, es decir, una cadena vacía y, por lo tanto, la condición es falsa se imprime.
Aquí estamos pasando "Hola" a la función y puede ver que la salida se imprime "Condición se cumple Hola".
fuente