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..
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.
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.
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..
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")
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..
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.
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")
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..
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.
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 ++
y --
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
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!