Swift 2 Salida temprano con guardia

¿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..

Minimizando la complejidad

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) 

Salir temprano

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..

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.

Salida

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 continuarDeclaració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 

Poderoso

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.

Alcance

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.

Conclusión

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.