English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
En este artículo, aprenderá a usar la instrucción guard para controlar el flujo de ejecución del programa.
Instrucción If de SwiftDescribe cómo ejecutar operaciones basadas en condiciones específicas (valores booleanos). En este artículo, aprenderemos los puntos fuertes de la instrucción guard en comparación con la instrucción if para controlar el flujo del programa y escribir código más simple y limpio.
La principal función de la instrucción guard es transferir el control del programa a un ámbito exterior bajo ciertas condiciones. Estas instrucciones son similares a las instrucciones if que ejecutan sentencias basadas en condiciones específicas (valores booleanos), pero a diferencia de if, la instrucción guard solo se ejecuta cuando no se satisfacen ciertas condiciones.
Además, la instrucción guard debe salir del ámbito. Por lo tanto, debemos usar instrucciones de control del programa del usuario (return, break, continue o throw) al final de la instrucción guard.
guard expression else { //Instrucción //Se debe incluir una instrucción de control: return, break, continue o throw. }
Aquí expression es una expresión booleana (que devuelve true o false).
Si el valor de expression se calcula como false, se ejecutará la instrucción guard dentro del bloque de código.
Si el valor de expression se calcula como true, la instrucción guard dentro del bloque de código se saltará al ejecutar.
Nota: el final de la instrucción guard debe contener una instrucción de control return, break, continue o throw.
Una instrucción guard válida simple es la siguiente:
guard true else { print("La condición no se cumple") } print("Se cumple la condición")
Al ejecutar el programa, la salida es:
Se cumple la condición
En el programa mencionado anteriormente, guard contiene un valor booleano true (se cumple la condición). Dado que la instrucción guard solo se ejecuta cuando no se cumple la condición, no se ejecutan las instrucciones dentro de guard. Por eso se ejecuta print("Se cumple la condición") y se muestra en la pantalla.Se cumple la condiciónla razón.
Ahora, cambie la condición a false:
guard false else { print("La condición no se cumple") } print("Se cumple la condición")
En el programa mencionado anteriormente, el resultado de la condición de protección es false. Por lo tanto, debe ejecutarse la instrucción print("La condición no se cumple") en else. Pero recibirá un mensaje de error:El cuerpo de 'guard' no puede caer a través, considere usar 'return' o 'throw' para salir del ámbito.
El mensaje de error significa que necesita usar instrucciones return, break, continue o throw para transferir el control del programa desde la instrucción guard. Ahora usaremos return. Dado que la instrucción return solo se puede usar dentro de una función, encapsularemos el código anterior en una función Swift.
Podemos usar en SwiftDentro de la funciónSe utiliza la instrucción guard, como se muestra a continuación:
func someFunction() { guard false else { print("La condición no se cumple") return } print("Se cumple la condición") } someFunction() print("Hello después de la llamada a la función")
Cuando ejecute el programa anterior, la salida será:
La condición no se cumple Hello se muestra después de la llamada a la función.
En el programa mencionado anteriormente, el resultado de la condición guard es false, por lo que se ejecutan las instrucciones dentro de guard. La primera instrucción print("La condición no se cumple") se muestra en la consola.:No se cumple la condición.
Y la instrucción return detiene la ejecución de la función, mientras que la instrucción print("Hello, after function call") imprime la salida después de la llamada a la función en la consola:Llamada a la función y salida Hello.
EnEn Swift OptionalsYa hemos visto el uso de if-Desempaquetar Optional con let. Pero también podemos usar la sentencia guard en lugar de if-Desempaquetar declaraciones opcionales con let, lo que tiene una ventaja. Usar guard en lugar de if-La principal ventaja de desempaquetar variables opcionales es que podemos aumentar el ámbito de desempaquetado.
Veamos esto en el siguiente ejemplo:
func changeOptionalStringToUpperCase() { var name: String? guard let temp = name else { print("El nombre es nil. No se puede procesar") return } print("Mayúsculas:\(temp.uppercased())") } changeOptionalStringToUpperCase()
Cuando ejecute el programa anterior, la salida será:
El nombre es nil. No se puede procesar
En el programa anterior, se puede ver que el valor no envuelto temp se usa fuera del alcance de la sentencia guard. Debido a que name se define como opcional y contiene un valor nil, la sentencia guard no puede desempaquetar este valor.
Por lo tanto, en el else de guard se ejecutan las siguientes instrucciones: se imprime "El nombre es nil. No se puede procesar", y se termina la función con la instrucción return. El código equivalente a la sentencia guard if else es:
func changeOptionalStringToUpperCase() { var name: String? if let temp = name { print("Mayúsculas:\(temp.uppercased())") } print("El nombre es nil. No se puede procesar") return } //¿Cómo acceder aquí? Solución: usar Guard } changeOptionalStringToUpperCase()
Atención, las dos sentencias anteriores son válidas y realizan el mismo trabajo. Sin embargo, usar if-No se puede usar let en if-El uso de valores no envueltos (unwrapped) fuera de una declaración let. Sin embargo, con una sentencia guard, puede usar valores no envueltos en una función.
Las sentencias guard pueden enlazar múltiples condiciones, separadas por comas (,), como se muestra a continuación:
func changeOptionalStringToUpperCase() { var name: String? = "" guard let temp = name, temp.count > 0 else { print("El nombre es nil o una cadena vacía. No se puede procesar") return } print("Mayúsculas:\(temp.uppercased())") } changeOptionalStringToUpperCase()
Cuando ejecute el programa anterior, la salida será:
El nombre es nil o una cadena vacía. No se puede procesar
En el programa anterior, la sentencia guard contiene dos condiciones separadas por comas.
La primera condición let temp = name desempaqueta un parámetro opcional, en nuestro ejemplo, esta condición devuelve true, la segunda condición temp.count > 0 verifica si la cadena desempaquetada contiene más de 0 caracteres, en nuestro ejemplo el resultado es false.
Por lo tanto, la sentencia ejecuta la declaración dentro de la sentencia guard print("El nombre es nil o una cadena vacía. No se puede procesar") ,su salida Name es nil o una cadena vacía. No se puede procesar en la consola y se utiliza la sentencia return para finalizar la función.