Swift From Scratch Opcionales y Flujo de Control

En los artículos anteriores, aprendiste algunos de los conceptos básicos del lenguaje de programación Swift. Si has programado antes, estoy seguro de que viste algunas similitudes con otros lenguajes de programación, como Ruby, JavaScript y Objective-C.

En este artículo, nos acercamos al flujo de control en Swift. Antes de que podamos analizar el flujo de control con más detalle, debemos analizar un concepto que es nuevo para la mayoría de ustedes, los opcionales. Los opcionales son otra característica de seguridad de Swift. Al principio, puede parecer una molestia utilizar opciones, pero pronto aprenderá que las opciones harán que su código sea mucho más seguro..

1. Opcionales

Ya hemos visto que una variable debe inicializarse antes de poder utilizarla. Eche un vistazo al siguiente ejemplo para comprender mejor lo que esto significa..

var str: String str.isEmpty

Si estás acostumbrado a trabajar con cadenas en Objective-C, entonces te sorprenderá que Swift te muestre un error. Veamos que nos dice ese error..

En muchos idiomas, las variables tienen un valor predeterminado inicial. En Objective-C, por ejemplo, la cadena en el siguiente fragmento de código es igual a nulo.

NSString * newString;

Sin embargo, el concepto de nulo Se diferencia en Swift y en Objective-C. Vamos a discutir nulo con más detalle un poco más tarde.

Qué es un opcional?

Swift usa opcionales para encapsular un concepto importante, es decir, una variable o constante tiene un valor o no lo tiene. Es así de simple en Swift. Para declarar una variable o constante como opcional, agregamos un signo de interrogación al tipo de variable o constante.

var str: String?

La variable str ya no es de tipo Cuerda. Ahora es de tipo Opcional Cuerda. Esto es importante de entender. El resultado o efecto secundario es que ya no podemos interactuar directamente con el valor de str variable. El valor se almacena de forma segura en el opcional, y debemos solicitar el opcional por el valor que encapsula.

Desenvolvimiento forzado

Una forma de acceder al valor de un opcional es a través del desenvolvimiento forzado. Podemos acceder al valor de la variable. str añadiendo un ! al nombre de la variable.

var str: String? str = impresión "de prueba" (str!)

Es importante que esté seguro de que el opcional contiene un valor cuando lo fuerza a desenvolverlo. Si el opcional no tiene un valor y lo fuerza a desenvolverlo, Swift le lanzará un error..

Encuadernación opcional

Hay una forma más segura de acceder al valor de un opcional. Vamos a echar un vistazo más de cerca a Si Declaraciones en unos minutos, pero el siguiente ejemplo muestra cómo podemos acceder de forma segura al valor almacenado en la variable str, que es de tipo opcional Cuerda.

var str: String? if str! = nil print (str!) else print ("str no tiene valor")

Primero comprobamos si la variable str es igual a nulo Antes imprimimos su contenido. En este ejemplo, str no tiene un valor, lo que significa que no será forzado a ser desenvuelto por accidente.

Hay un enfoque más elegante llamado enlace opcional. En el siguiente ejemplo, asignamos el valor almacenado en el opcional a una constante temporal, que se utiliza en el Si declaración. El valor del opcional. str está ligado a la constante strConst y utilizado en el Si declaración. Este enfoque también funciona para mientras declaraciones.

var str: String? str = "Prueba" si se deja strConst = str print (strConst) else print ("str no tiene valor")

Que es nulo?

Si vienes de Objective-C, entonces seguramente sabes qué nulo es. En Objective-C, nulo Es un puntero a un objeto que no existe. Swift define nulo un poco diferente, y es importante que entiendas la diferencia.

En Swift, nulo Significa la ausencia de un valor, cualquier valor. Mientras nulo solo es aplicable a objetos en Objective-C, en Swift nulo Puede ser utilizado para cualquier tipo. Por lo tanto, es importante entender que un opcional no es el equivalente de nulo en Objective-C. Estos conceptos son muy diferentes..

2. Control de flujo

Swift ofrece una serie de construcciones comunes para controlar el flujo del código que escribes. Si tiene experiencia en programación, no tendrá problemas para ponerse al día con las construcciones de flujo de control de Swift, condicionales Si y cambiar declaraciones, y para y mientras bucles.

Sin embargo, Swift no sería Swift si su flujo de control no fuera ligeramente diferente de, por ejemplo, las construcciones de flujo de control de Objective-C. Si bien los detalles son importantes, estoy seguro de que no impedirán que te pongas al día con Swift. Comencemos con la construcción condicional más común, la Si declaración.

Si

De Swift Si Las declaraciones son muy similares a las que se encuentran en Objective-C. La principal diferencia es que no es necesario envolver la condición entre paréntesis. Los frenos, sin embargo, son obligatorios. Este último evita que los desarrolladores introduzcan errores comunes relacionados con la escritura Si Declaraciones sin llaves. Esto es lo que un Si declaración se ve como en Swift.

deje a = 10 si a> 10 imprime ("El valor de \" a \ "es mayor que 10.") else imprime ("El valor de \" a \ "es menor o igual a 10." )

No debería sorprender que Swift también defina un más cláusula. El código en el más cláusula se ejecuta si la condición es igual a falso. También es posible encadenar Si declaraciones como se muestra en el siguiente ejemplo.

deje a = 10 si a> 10 imprime ("El valor de \" a \ "es mayor que 10.") más si a> 5 imprime ("El valor de \" a \ "es mayor que 5. ") else print (" El valor de \ "a \" es menor o igual a 5 ")

Hay una nota importante que hacer, es decir, la condición de un Si declaración debe devolver cierto o falso. Esto no es cierto para Si Declaraciones en Objective-C. Echa un vistazo a lo siguiente Si declaración en Objective-C.

NSArray * array = @ []; if (array.count) NSLog (@ "La matriz contiene uno o más elementos.");  else NSLog (@ "La matriz está vacía."); 

Si tuviéramos que transferir el fragmento de código anterior a Swift, nos encontraríamos con un error. El error no es muy informativo, pero Swift nos dice que debemos asegurarnos de que el resultado de la condición se evalúe cierto o falso.

La forma correcta de traducir el fragmento anterior de Objective-C a Swift es asegurarse de que la condición del Si declaración evalúa a cierto o falso, como en el siguiente fragmento.

let array = [String] () if array.count> 0 print ("La matriz contiene uno o más elementos.") else print ("La matriz está vacía.")

cambiar

De Swift cambiar La declaración es más poderosa que su equivalente en Objective-C. También es más seguro, ya que aprenderá en un momento. Si bien hay algunas diferencias, cambiar las declaraciones en Swift se adhieren al mismo concepto que las de otros lenguajes de programación; se pasa un valor a la cambiar declaración, y se compara con posibles patrones de coincidencia.

Así es, los patrones. Como dije, un cambiar Declaración en Swift tiene algunos trucos bajo la manga. Vamos a echar un vistazo a esos trucos en un momento. Hablemos de seguridad primero.

Exhaustivo

UNA cambiar La declaración en Swift debe ser exhaustiva, lo que significa que todo valor posible del tipo que se entrega a la cambiar declaración debe ser manejada por el cambiar declaración. Como en Objective-C, esto se resuelve fácilmente agregando un defecto caso, como se muestra en el siguiente ejemplo.

deje a = 10 cambiar a caso 0: imprimir ("a es igual a 0") caso 1: imprimir ("a es igual a 1") predeterminado: imprimir ("a tiene otro valor")

Caer a través

Una diferencia importante con la implementación de Objective-C cambiar declaraciones es la falta de caída implícita. El siguiente ejemplo no funciona en Swift por algunas razones.

deje a = 10 cambiar a caso 0: caso 1: imprimir ("a es igual a 1") predeterminado: imprimir ("a tiene otro valor")

El primer caso en el que una se compara con 0 no cae implícitamente en el segundo caso en el que una se compara con 1. Si agrega el ejemplo anterior a su área de juegos, notará que Swift le arroja un error. El error dice que cada caso debe incluir al menos una declaración ejecutable.

Tenga en cuenta que los casos de la cambiar declaración no incluye descanso declaraciones para romper con el cambiar declaración. Esto no es necesario en Swift, ya que no existe un fallo implícito en Swift. Esto eliminará una serie de errores comunes causados ​​por fallos involuntarios..

Patrones

El poder de un cambiar declaración en Swift se encuentra en la coincidencia de patrones. Eche un vistazo al siguiente ejemplo en el que he usado rangos para comparar el valor considerado con.

Dejemos que a = 10 cambie a caso 0 ... <5: print("The value of a lies between 0 and 4.") case 5… 10: print("The value of a lies between 5 and 10.") default: print("The value of a is greater than 10.") 

los ... < operador o operador de rango medio abierto define un rango desde el primer valor al segundo valor, excluyendo el segundo valor. los ... operador o operador de rango cerrado define un rango desde el primer valor al segundo valor, incluido el segundo valor. Estos operadores son muy útiles en una amplia gama de situaciones..

También puede comparar el valor considerado de un cambiar Declaración a las tuplas. Eche un vistazo al siguiente ejemplo para ver cómo funciona esto..

let latlng = (34.15, -78.03) switch latlng case (0, 0): print ("Estamos en el centro del planeta.") case (0 ... 90, _): print ("Estamos en el hemisferio norte. ") caso (-90 ... 0, _): imprimir (" Estamos en el hemisferio sur ") predeterminado: imprimir (" La coordenada no es válida. ")

Como puede ver en el ejemplo anterior, es posible que el valor coincida con más de un caso. Cuando esto sucede, se elige el primer caso coincidente. El ejemplo anterior también ilustra el uso del guión bajo. Como vimos en el artículo anterior, podemos usar un guión bajo, _, decirle a Swift qué valores no nos interesan.

Enlace de valor

La vinculación de valores también es posible con cambiar declaraciones, como demuestra el siguiente ejemplo. El segundo valor de la tupla está temporalmente vinculado a la constante descripción para uso en el primer y segundo caso.

var response = (200, "OK") cambiar respuesta caso (200 ... <400, let description): print("The request was successful with description \(description).") case (400… <500, let description): print("The request was unsuccessful with description \(description).") default: print("The request was unsuccessful with no description.") 

para

los para bucle es la primera construcción de bucle que echaremos un vistazo. Se comporta de manera muy similar a para Bucles en otros idiomas. Solía ​​haber dos sabores, el para bucle y el para-en lazo. A partir de Swift 3, sin embargo, el estilo C para Los bucles ya no están disponibles. El siguiente fragmento de código no es posible en Swift 3.

para var i = 0; yo < 10; i++  print("i is equal to \(i).") 

Si pega este fragmento en un área de juegos, también notará que ++-- Los operadores ya no están disponibles en Swift 3..

los para-en bucle es ideal para recorrer en bucle el contenido de un rango o colección. En el siguiente ejemplo, hacemos un bucle sobre los elementos de una matriz.

dejar números = [1, 2, 3, 5, 8] para números en números imprimir ("número es igual a \ (número)")

También podemos usar para-en bucles para recorrer los pares clave-valor de un diccionario. En el siguiente ejemplo, declaramos un diccionario e imprimimos su contenido en la consola. Como vimos anteriormente en esta serie, la secuencia de los pares clave-valor no está definida ya que un diccionario es un conjunto desordenado de pares clave-valor.

var bids = ["Tom": 100, "Bart": 150, "Susan": 120] para (nombre, oferta) en las ofertas print ("\ (name) 's offer is $ \ (bid).") 

Cada par clave-valor del diccionario está disponible en el para-en bucle como una tupla de constantes con nombre. los para-en Bucle también es genial en combinación con rangos. Estoy seguro de que está de acuerdo en que el siguiente fragmento de código es fácil de leer y entender gracias al uso de un rango cerrado.

para i en 1 ... 10 print ("i es igual a \ (i)")

mientras

los mientras bucle viene en dos sabores, mientras y repetir mientras. La principal diferencia es que el conjunto de declaraciones de un repetir mientras bucle siempre se ejecuta al menos una vez, porque la condición de la repetir mientras Se evalúa al final de cada iteración. El siguiente ejemplo ilustra esta diferencia.

var c = 5 var d = 5 mientras que c < d  print("c is smaller than d")  repeat  print("c is smaller than d")  while c < d

La declaración impresa de la mientras el bucle nunca se ejecuta, mientras que el de la repetir mientras el bucle se ejecuta una vez.

En muchos casos, para Los bucles se pueden reescribir como mientras bucles, y a menudo depende del desarrollador determinar qué tipo de bucle usar en una situación particular. El seguimiento para y mientras los bucles dan como resultado la misma salida.

para i en 0 ... <10  print(i)  var i = 0 while i < 10  print(i) i += 1 

Conclusión

Hay mucho más para controlar el flujo en Swift de lo que hemos cubierto en este artículo, pero ahora tiene un entendimiento básico para continuar su viaje hacia Swift. Espero que este tutorial le haya mostrado cómo la implementación del flujo de control de Swift es muy similar a la de otros lenguajes de programación, pero con un giro.

En el resto de esta serie, haremos un mayor uso de las construcciones de flujo de control de Swift, y gradualmente comprenderá mejor las diferencias sutiles entre Swift y lenguajes como Objective-C. En la próxima entrega de esta serie, comenzaremos a explorar las funciones..

Si desea una manera rápida de comenzar a crear aplicaciones con el lenguaje Swift, tenemos un curso para eso!

O echa un vistazo a algunos de nuestros otros tutoriales y cursos sobre el desarrollo de Swift y iOS!