En este artículo, aprenderá a usar la declaración de guardia para controlar el flujo de ejecución de su programa.
Swift If Statement describe cómo puede realizar acciones en función de determinada condición (valor booleano). En este artículo, exploraremos los beneficios de la declaración de protección sobre la declaración if para controlar el flujo del programa y escribir un código más simple y limpio.
Declaración de Swift Guard
El uso principal de la declaración de protección es transferir el control del programa fuera de un alcance en determinadas condiciones. Estas declaraciones son similares a las declaraciones if que ejecutan declaraciones basadas en cierta condición (valor booleano) pero a diferencia de if, las declaraciones de protección solo se ejecutan cuando no se cumplen ciertas condiciones.
Además, las declaraciones dentro de la guardia deben salir del alcance. Por lo tanto, tenemos que las sentencias de control del programa de usuario return
, break
, continue
o throw
al final de la instrucción de guardia.
Declaración de sintaxis de Guard
expresión de guardia else (// declaraciones // deben contener una declaración de control: volver, romper, continuar o lanzar).
- Aquí, expresión es una expresión booleana (devuelve
true
ofalse
). - Si la expresión se evalúa en
false
,guard
se ejecutan sentencias dentro del bloque de código de . - Si la expresión se evalúa en
true
, las declaraciones dentro del bloque de código deguard
se omiten de la ejecución.
¿Cómo funciona la declaración de guardia?
Nota: El final de la instrucción de guardia debe contener una sentencia de control return
, break
, continue
o throw
.
Ejemplo 1: ¿Cómo funciona la declaración de guardia?
Una simple declaración de guardia válida es la siguiente:
guard true else ( print("Condition not met") ) print("Condition met")
Cuando ejecute el programa, la salida será:
Condición cumplida
En el programa anterior, guard contiene un valor booleano verdadero (se cumple la condición). Dado que las declaraciones de guardia solo se ejecutan cuando no se cumple la condición, la declaración dentro de la guardia no se ejecuta. Es por eso que print("Condition met")
se ejecuta la condición y las salidas se cumplen en la pantalla.
Ahora cambiemos la condición a falsa como:
Ejemplo 2: la declaración de guardia debe salir del alcance
guard false else ( print("Condition not met") ) print("Condition met")
En el programa anterior, la condición de protección se evalúa como false
. Entonces, la declaración print("Condition not met")
dentro de else debería ejecutarse. Pero obtendrá un error que dice que el cuerpo 'guard' puede no caer, considere usar un 'retorno' o 'lanzar' para salir del alcance.
El mensaje de error en el medio de palabras sencillas, es necesario transferir el control del programa a partir de la declaración de protección usando return
, break
, continue
o throw
declaraciones. Por ahora vamos a utilizar return
. Y dado que la return
declaración solo se puede usar dentro de una función, vamos a ajustar el código anterior en Swift Functions.
Ejemplo 3: declaración de guardia dentro de una función
Podemos usar la declaración de guardia dentro de una función en Swift como:
func someFunction() ( guard false else ( print("Condition not met") return ) print("Condition met") ) someFunction() print("Hello after function call")
Cuando ejecute el programa anterior, la salida será:
Condición no cumplida Hola después de la llamada a la función
En el programa anterior, la condición de protección se evalúa false
, por lo tanto, se ejecutan las declaraciones dentro de la protección. La primera declaración print("Condition not met")
genera la Condición no cumplida en la consola.
Y la declaración return
termina la ejecución de una función y la declaración print("Hello, after function call")
después de la llamada a la función se ejecuta, lo que genera un saludo después de la llamada a la función en la consola.
Ejemplo 4: Guardia con opcionales
Hemos visto en Swift Optionals el uso de if-let
para desenvolver un archivo opcional. Sin embargo, también podemos usar una declaración de guardia en lugar de if-let
para desenvolver un opcional con una ventaja. La principal ventaja de desenvolver un opcional con guard en lugar de if-let
es que podemos aumentar el alcance de la variable desenvuelta .
Veamos esto en el siguiente ejemplo:
func changeOptionalStringToUpperCase() ( var name:String? guard let temp = name else ( print("Name is nil. Cannot process") return ) print("Uppercased:(temp.uppercased())") ) changeOptionalStringToUpperCase()
Cuando ejecute el programa anterior, la salida será:
El nombre es nulo. No se puede procesar
En el programa anterior, puede ver que el valor no empaquetado temp se está utilizando fuera del alcance definido por la declaración de guardia. Dado que el nombre se define como opcional y contiene un valor nulo, la declaración de protección no puede desenvolver el valor.
Entonces, las declaraciones dentro de guard else ejecutan que imprimen Name is nil. No se puede procesar en la salida y finaliza la función con una return
declaración. El código equivalente de la declaración de protección anterior declaración if-else es:
func changeOptionalStringToUpperCase() ( var name:String? if let temp = name ( print("Uppercased:(temp.uppercased())") ) else ( print("Name is nil. Cannot process") return ) //how to access temp here?? Solution:Use Guard ) changeOptionalStringToUpperCase()
Observe que dos declaraciones son válidas y hacen el mismo trabajo. Pero usando la declaración if-let no puede usar el valor sin envolver fuera de la declaración if-let. Pero con la declaración de guardia puede usar el valor sin envolver en toda la función.
Ejemplo 5: Guardia con múltiples condiciones
Las declaraciones de protección también pueden encadenar varias condiciones separadas por comas (,) como:
func changeOptionalStringToUpperCase() ( var name:String? = "" guard let temp = name , temp.count> 0 else ( print("Name is nil or an empty string. Cannot process") return ) print("Uppercased:(temp.uppercased())") ) changeOptionalStringToUpperCase()
Cuando ejecute el programa anterior, la salida será:
El nombre es nulo o una cadena vacía. No se puede procesar
En el programa anterior, la declaración de protección contiene dos condiciones separadas por comas.
La primera condición let temp = name
desenvuelve un opcional que regresa true
en nuestro caso y la segunda condición temp.count> 0
verifica si la cadena desenvuelta tiene más de 0 caracteres que se evalúa false
en nuestro ejemplo.
Por lo tanto, la declaración dentro de la declaración de guardia ejecuta una declaración print("Name is nil or an empty string. Cannot process")
que da como resultado Name es nil o una cadena vacía. No se puede procesar en la consola y finaliza la función con una return
declaración.