En este artículo veremos las instrucciones de flujo de control como bucles o condicionales.
If y switch
La forma de condicionar un flujo de ejecución, para hacer que nuestro programa ejecute o no determinadas partes de código, se hace con las instrucciones if y switch. El primero es una simple condición (si x es igual a y, haz z) y el segundo es lo que se denomina una sentencia case, o lo que es lo mismo, un listado de posibles, con un conjunto de instrucciones en caso de cumplirse una de estas condiciones (dependiendo del valor de x, si es 1 haz esto, si es 2 esto otro, si es 3 lo de más allá. Si no es ninguno de estos, entonces nada). Ej:
var m = ["Mad Men", "Better Call Saul", "Talking Dead", "Humans"] if m.count > 3{ print("Hay más de 3 series") } else{ print("Hay 3 series o menos") }
Si nos fijamos, if solo acepta una condición o su contraria, pero ¿qué pasa si queremos hacer diferentes cosas en función de diferentes posibles condiciones para una misma variable? Para eso usamos switch.
let indice = Int(arc4random()) % m.count let serie = m[indice] switch serie { case "Mad Men": print ("Él Mad Men") case "Better Call Saul": print ("Es Better Call Saul") default: print ("No es ninguno de estos") }
Obs: arc4random() es una función que devuelve un número aleatorio, el cual podemos acotar con el operador %. Pero esta función (que pertenece a C) devuelve un tipo UInt32 el cual hay que convertir a un Int de Swift, por eso va acotado con Int(arc4random()) (lo que se llama una operación de casting o conversión de tipos). Luego le añadimos el operador % y el número en que queremos acotarlo. De esta forma obtendremos un número aleatorio entre 0 y el número que digamos.
También podemos utilizar Switch con rangos o bien utilizando patrones:
var numero = 5 switch numero { case 1...3: print ("1 al 3") case 4...5: print ("4 al 5") default: print ("No encontrado") } let nombre = "Rodrigo Alejandro" switch nombre { case "Rodrigo": print ("Te llamas Rodrigo") case let x where x.hasSuffix("Alejandro"): print ("Encontramos a Rodrigo") default: print ("No encontrado") }
For in, repeat while
Siguiente paso: bucles. Un bucle es un trozo de código que se repite n veces. Puede servir para recorrer todos los valores de un array (lo que llamamos enumeración de un array) o para ejecutar ininterrumpidamente un trozo de código hasta que dentro de este se cumpla una condición determinada o porque queremos hacer algo repetitivo un número determinado de veces. Las veces pueden conocerse de antemano o establecerse según valores que solo se conocen en tiempo de ejecución del programa.
//Forma normal for s in m { print (s) } //Al revez for s in m.reversed() { print (s) } //Otro ejemplo for num in 1...10 { print("Número \(num)") } //Ejemplo con indice for (index, data) in m.enumerated() { print("Dato \(data) - Indice \(index)") }
Lo que hace for in es simple: a la variable que sigue a la palabra clave for se le asigna en cada recorrido del bucle un valor que comprende los rangos, valores o recorridos que se indiquen tras la palabra in.
El caso de repeat while es muy diferente. Es un ciclo que se repite indefinidamente hasta que, al final del mismo, se cumpla la condición que indiquemos, suponiendo el fin de dicho ciclo y la salida de esas llaves.
var valor:Int? let acierto = Int(arc4random()) % 10 print ("Buscando el número \(acierto)") repeat { valor = Int(arc4random()) % 20 if acierto != valor { print ("No he acertado. Ha salido el número \(valor!)") } } while acierto != valor print("Enhorabuena. Salió el \(valor!)") //While Normal var numero = 1 while numero < 5{ print(numero) numero += 1 }
En este pequeño ejemplo, elegimos un valor aleatorio del 0 al 10 y luego hacemos un bucle repeatwhile para repetir la elección de otro valor aleatorio de igual rango, que se repite hasta que vuelve a salir el mismo número. Como vemos el repeat establece la evaluación de diferencia != por lo que se repite lo que hay entre las llaves que contienen repeat while, mientras acierto sea diferente de valor.
Obs: Swift no admite valores vacíos de inicialización, pero sí podemos inicializar una variable sin saber qué valor tendrá en ese momento, si no que se establecerá en el futuro. Eso se hace con un ? tras el tipo de variable.