¿Te sorprende que esté dedicando un tutorial a una adición simple como el Guardia
¿declaración? Espero que entiendas mejor mi emoción al final de este tutorial. Durante este tutorial, espero convencerte de que Guardia
No es una adición redundante al lenguaje de programación Swift..
Los condicionales son un componente fundamental de todo lenguaje de programación. Objective-C y Swift no son una excepción a esta regla. Si planea escribir una aplicación de cualquier complejidad, los condicionales se cruzarán en su camino, no hay forma de escaparlos..
Desafortunadamente, los condicionales son a menudo la causa misma de la complejidad. Los condicionales anidados en particular pueden llevar a errores difíciles de encontrar, códigos difíciles de entender y casos de borde fácilmente pasados por alto.
Mantener anidado Si
Como mínimo, con frecuencia utilizo el siguiente patrón en Objective-C.
- (void) fetchListOfCustomers: (NSArray *) clientes if (! self.reachable) return; si (! auto.conectado) regresa; if (! clients ||! [clientes cuentan]) return; ...
La idea es rescatar lo antes posible. los Si
Las declaraciones en el ejemplo representan un conjunto de requisitos que deben cumplirse antes de que se ejecute el resto del cuerpo del método..
El ejemplo anterior se traduce en el siguiente equivalente ligeramente más complejo.
- (void) fetchListOfCustomers: (NSArray *) clientes si (self.reachable && self.connected) if (clientes && [conteo de clientes]) …
¿Ves el problema acechando en este ejemplo? Ya estamos anidados a dos niveles sin haber hecho nada interesante..
Es fácil traducir el patrón anterior a Swift. La sintaxis parece similar, pero debido a clientes
Al ser opcional, necesitamos desenvolver el clientes
argumento antes de que podamos acceder a su valor.
func fetchListOfCustomers (clientes: ¿[Cliente]?) si! alcanzable retorno si! conectado retorno si deja clientes = clientes donde clientes.contar> 0 imprimir (clientes)
Swift 2 introduce el Guardia
declaración. Fue diseñado específicamente para salir temprano de un método o función. los Guardia
es ideal para deshacerse de condicionales profundamente anidados cuyo único propósito es validar un conjunto de requisitos. Eche un vistazo al ejemplo actualizado en el que he reemplazado cada Si
declaración con el nuevo Guardia
declaración.
func fetchListOfCustomers (clientes: ¿[Cliente]?) guardia accesible else return guardia conectado else return guardia dejar clientes = clientes donde clientes.contar> 0 else retorno imprimir (clientes)
Hay varias cosas que vale la pena destacar. Empecemos con la sintaxis..
los Guardia
palabra clave hace hincapié en que estamos validando un requisito. Estamos vigilando en contra de algo. En el ejemplo, comprobamos explícitamente si accesible
y conectado
son cierto
. Si no lo son, entonces salimos del método temprano. El punto es que la sintaxis es más explícita sobre los requisitos que una regular Si
declaración.
Tenga en cuenta que un Guardia
declaración siempre tiene una más
cláusula. los más
cláusula se ejecuta si la condición de la Guardia
declaración evalúa a falso
. Utilizando Guardia
Tiene mucho más sentido cuando estás validando requisitos.
En el más
cláusula, debe transferir el control fuera del alcance en el que Guardia
aparece la declaración. Usamos un regreso
en el ejemplo anterior, pero podría, por ejemplo, utilizar un continuar
Declaración si estás en un bucle o lanzar un error. Eche un vistazo al siguiente ejemplo actualizado en el que lanzamos un error en el más
cláusula. Nota la arroja
palabra clave en la declaración de método para indicar que fetchListOfCustomers (_ :)
es un metodo de lanzamiento.
func fetchListOfCustomers (clientes: ¿[Cliente]?) lanza guarda accesible otra vez lanza APIError.APIErrorUnreachable guardia conectado en otra parte lanza APIError.APIErrorNotConnected guardia deja a los clientes = clientes donde clientes.cuenta> 0 else lanza APIError.APIErrorNoCustomers
UNA Guardia
declaración es tan poderosa como una Si
declaración. Puede utilizar enlaces opcionales e incluso el uso de dónde
Se permiten cláusulas, introducidas en Swift 1.2. Estoy seguro de que está de acuerdo en que el ejemplo es fácil de entender, eliminando condicionales anidados innecesarios.
Una diferencia importante con Si
sentencias es el alcance de las variables y constantes a las que se asignan valores mediante un enlace opcional. En el ejemplo anterior, el clientes
a la constante se le asignó un valor mediante un enlace opcional. los clientes
constante es accesible desde el ámbito de la Guardia
aparece en. Este es un detalle importante y una de las ventajas clave de usar Guardia
.
Si tu pensabas que Guardia
Fue una variación simple en Swift Si
Declaración, entonces espero haberte convencido de lo contrario. Mientras Si
Las declaraciones continuarán siendo su herramienta de elección en la mayoría de las situaciones., Guardia
Tiene una serie de ventajas en determinadas situaciones. Esto es especialmente cierto si se usa en combinación con el manejo de errores, que también se introdujo en Swift 2.