Una instrucción switch te permite comparar un valor con varios valores posibles.
Te permite escribir código más conciso que usando varias instrucciones else-if.
Una instrucción switch empieza con la palabra clave switch seguida del valor que se va a comparar.
Después puedes definir los casos con la palabra clave case seguida del valor con el que se compara.
La palabra clave default se usa para definir el caso por defecto, cuando no coincide ninguno de los demás.
Igual que las instrucciones else-if, las instrucciones switch solo ejecutan el bloque de código asociado al primer caso que coincida.
switch value {
case 1:
print("One")
case 2:
print("Two")
default:
print("Other")
}
Fíjate en el siguiente ejemplo:
if str == "apple" {
print("Let's bake an apple crumble")
} else if str == "lemon" {
print("Let's bake a lemon meringue pie!")
} else if str == "peach" {
print("Let's bake a peach pie!")
} else {
print("Let's buy ice cream.")
}
En su lugar, podría escribirse así:
switch str {
case "apple":
print("Let's bake an apple crumble")
case "lemon":
print("Let's bake a lemon meringue pie!")
case "peach":
print("Let's bake a peach pie!")
default:
print("Let's buy ice cream.")
}
while
Un bucle while es una instrucción de control de flujo que permite ejecutar código mientras se cumple una condición.
Swift ofrece dos tipos de bucles while: los bucles while y los bucles repeat-while.
La condición del bucle while se evalúa antes de que se ejecute el cuerpo del bucle; si la condición es falsa, el cuerpo del bucle no se ejecutará en absoluto.
Los bucles while en Swift tienen la siguiente estructura:
while <#condition#> {
<#code#>
}
Aquí el bucle se ejecutará mientras count sea mayor que 0 y, por tanto, imprimirá los números 2, 1 y «Liftoff!».
var count = 2
while count > 0 {
print("\(count)…")
count -= 1
}
print("Liftoff!")
// prints:
// 2…
// 1…
// Liftoff!
Un bucle repeat-while es similar a un bucle while, pero la condición se evalúa después de que se ejecute el cuerpo del bucle.
Esto significa que el cuerpo del bucle siempre se ejecutará al menos una vez, incluso si la condición es falsa.
Los bucles repeat-while en Swift tienen la siguiente estructura:
repeat {
<#code#>
} while <#condition#>
Aquí el bucle solo se ejecutará una vez, ya que la condición es falsa.
Como es un bucle repeat-while, el cuerpo del bucle se ejecutará una vez antes de que se evalúe la condición.
var count = 2
repeat {
print("\(count)…")
} while count < 0
print("Liftoff!")
Swift tiene un conjunto de instrucciones que pueden usarse para alterar el flujo de control normal de los bucles.
Se conocen como instrucciones de transferencia de control.
Ya has visto return; en este concepto conocerás otras, entre las que se incluyen continue, break y las etiquetas.
No trataremos fallthrough en este concepto, pero puedes leer sobre él en el libro de Swift.
A veces es necesario saltar antes de tiempo a la siguiente iteración de un bucle, sin completar el resto de las instrucciones de la iteración actual del bucle.
Para ello se puede usar la palabra clave continue.
Cuando se ejecuta continue, el bucle salta a la siguiente comprobación para ver si se puede ejecutar la siguiente iteración del bucle, es decir, el while en los bucles while y repeat-while, o la comprobación de si queda otro elemento en la secuencia en los bucles for-in.
count = 1
while count < 6 {
count += 1
if count == 4 { continue }
print(count)
}
// prints:
// 2
// 3
// 5
Break se usa para salir antes de tiempo de un bucle.
Cuando se ejecuta break, el bucle sale de inmediato y el programa continúa con la primera instrucción después del bucle.
for fruit in ["banana", "grapes", "apple", "strawberry", "kiwi", "lemon"] {
if !fruit.count.isMultiple(of: 2) { break }
print(fruit)
}
// prints:
// banana
// grapes
Cuando los bucles están anidados, hay ocasiones en las que se puede querer usar break o continue para salir o reiniciar los bucles externos que contienen el bucle en el que se usan break o continue.
En casos como estos, se pueden usar etiquetas para especificar el bucle del que se quiere salir o que se quiere reiniciar.
Un bucle se puede etiquetar escribiendo un nombre seguido de dos puntos antes del while, el repeat o el for que inicia el bucle.
Para ver el efecto de usar etiquetas de esta forma, fíjate en el siguiente bucle.
outerLoop: for fruit in ["banana", "grapes", "apple", "strawberry", "kiwi", "lemon"] {
print("\n--- \(fruit) ---")
for letter in fruit {
guard letter != "n" else { break outerLoop }
print(letter)
}
}
// prints:
// --- banana ---
// b
// a
Eres un mixólogo experto y preparas bebidas ricas para que el público las disfrute cuando sale de noche. Pero has pensado que podrías facilitarte la vida escribiendo un poco de código que te ayude con tu trabajo.
Las distintas bebidas tardan distinta cantidad de tiempo en prepararse:
"beer", "soda" y "water" tardan 0,5 minutos cada una."shot" tardan 1,0 minutos, los "mixed drink" tardan 1,5 minutos,"fancy drink" tardan 2,5 minutos,"frozen drink" tardan 3,0 minutos.Implementa la función timeToPrepare(drinks:), que toma el argumento drinks, que contiene un array de strings que representan las bebidas que hay que preparar.
La función debe devolver el tiempo total que se tardará en preparar todas las bebidas del array.
timeToPrepare(drinks: ["beer", "frozen drink", "shot"])
// returns 4.5
Una de las primeras cosas que tienes que hacer al empezar tu turno es asegurarte de que tu pequeña cubeta de gajos de lima esté llena para el turno que tienes por delante. Tendrás limas de distintos tamaños, que darán distinta cantidad de gajos: de una lima "small" puedes sacar 6 gajos, de una "medium" 8 gajos y de una "large" 10.
Mientras sigas necesitando más gajos y aún te queden limas por cortar, saca la primera lima del array y resta del número de gajos que necesitas la cantidad de gajos correspondiente. Continúa así hasta que ya no necesites más gajos o te quedes sin limas.
Implementa la función makeWedges(needed:limes:), que toma los argumentos needed, que contiene el número de gajos que necesitas cortar, y limes, que contiene un array de strings que representan los tamaños de las limas que tienes disponibles para cortar.
La función debe devolver el número de limas que has cortado.
makeWedges(needed: 25, limes: ["small", "small", "large", "medium", "small"])
// returns 4
¡Enhorabuena! Tu larga jornada de trabajo está a punto de terminar y pronto te irás a casa a trabajar en tu nueva app. Pero todavía tienes un montón de pedidos de bebidas que preparar antes de poder pasar los pedidos al siguiente turno e irte.
Mientras te quede tiempo en el turno, debes preparar el primer pedido del array y luego eliminar ese pedido del array.
Después puedes restar del tiempo que te queda de turno el tiempo que se ha tardado en preparar ese pedido, según tu función timeToPrepare(drinks:).
Implementa la función finishShift(minutesLeft:remainingOrders:), que recibe el número de minutos que quedan en tu turno (se garantiza que es mayor que 0) y un array no vacío de pedidos de bebidas.
La función debe devolver el array de pedidos que aún no te ha dado tiempo a preparar antes de que acabe tu turno.
finishShift(minutesLeft: 5, remainingOrders: [["beer", "frozen drink", "shot"], ["fancy drink", "soda"], ["beer", "beer", "water"], ["mixed drink", "frozen drink"]])
// returns [["beer", "beer", "water"], ["mixed drink", "frozen drink"]]
Para asegurarte de que la cerveza y el refresco se mantengan frescos, necesitas hacer un seguimiento de sus pedidos junto con las horas a las que se hicieron esos pedidos.
Implementa la función orderTracker(orders: [(drink: String, time: String)]) -> (beer: (first: String, last: String, total: Int)?, soda: (first: String, last: String, total: Int)?), que, dado un array de pedidos y sus horas, devuelve un par de tuplas opcionales que contienen las horas del primer y el último pedido de cerveza y de refresco, junto con el número total de pedidos de cada uno, y nil si no se hizo ningún pedido de esas bebidas. No necesitas hacer un seguimiento de ninguna otra bebida.
Implementa la función orderTracker(orders:), que recibe un array de tuplas, donde cada tupla contiene la bebida pedida y la hora a la que se hizo el pedido.
La función debe devolver una tupla que contenga la primera y la última hora a la que se pidió cerveza, el número total de pedidos de cerveza, la primera y la última hora a la que se pidió refresco y el número total de pedidos de refresco.
Debe devolverse como una tupla con el formato: (beer: (first: String, last: String, total: Int)?, soda: (first: String, last: String, total: Int)?).
let orders = [
(drink: "beer", time: "10:01"), (drink: "frozen drink", time: "10:02"),
(drink: "shot", time: "10:05"), (drink: "fancy drink", time: "10:06"),
(drink: "soda", time: "10:09"), (drink: "beer", time: "10:15"), (drink: "beer", time: "10:22"),
(drink: "water", time: "10:26"), (drink: "mixed drink", time: "10:28"),
(drink: "frozen drink", time: "10:33"),
]
orderTracker(orders: orders)
// returns (beer: (first "10:01", last "10:22", total 3), soda: (first "10:09", last "10:09", total 1))
Regístrate en Exercism para aprender y dominar Swift con 35 conceptos116 ejercicios y mentoría humana real, todo gratis.