Una sentencia switch te permite comparar un valor con varios valores posibles.
Te permite escribir código más conciso que usando varias sentencias else-if.
Una sentencia 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 predeterminado cuando ninguno de los casos coincide.
Al igual que las sentencias else-if, las sentencias switch solo ejecutan el bloque de código asociado con el primer caso que coincida.
switch value {
case 1:
print("One")
case 2:
print("Two")
default:
print("Other")
}
Considera 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.")
}
Esto también 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.")
}
Un bucle while es una sentencia de flujo de control que permite ejecutar código mientras cierta condición sea verdadera. Swift ofrece dos tipos de bucles while: el bucle while y el bucle 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 lo 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 ejecuta 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 sentencias que se pueden usar para alterar el flujo de control normal de los bucles.
Se conocen como sentencias de transferencia de control.
Ya viste return; este concepto presentará otras, entre las que se incluyen continue, break y las etiquetas.
No cubriremos fallthrough en este concepto, pero puedes leer sobre él en el libro de Swift.
A veces es necesario saltar a la siguiente iteración de un bucle antes de tiempo, sin completar el resto de las sentencias de la iteración actual del bucle.
La palabra clave continue se puede usar para esto.
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 hay 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 de un bucle antes de tiempo.
Cuando se ejecuta break, el bucle se cierra de inmediato y el programa continúa con la primera sentencia 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 veces en las que puedes 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 colocando un nombre seguido de dos puntos antes del while, repeat o for que inicia el bucle.
Para ver el efecto de usar etiquetas de esta manera, considera 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 sabrosas bebidas para que el público las disfrute en sus salidas nocturnas. Pero pensaste que podías hacerte la vida más fácil escribiendo un poco de código que te ayude con tu trabajo.
Cada bebida toma una cantidad distinta de tiempo en prepararse:
"beer", "soda" y "water" toman 0.5 minutos cada una."shot" toman 1.0 minutos, los "mixed drink" toman 1.5 minutos,"fancy drink" toman 2.5 minutos,"frozen drink" toman 3.0 minutos.Implementa la función timeToPrepare(drinks:), que toma el argumento drinks, el cual contiene un array de strings que representan las bebidas que hay que preparar.
La función debe devolver el tiempo total que tomará preparar todas las bebidas del array.
timeToPrepare(drinks: ["beer", "frozen drink", "shot"])
// returns 4.5
Una de las primeras cosas que debes hacer cuando empiezas tu turno es asegurarte de que tu pequeño recipiente de gajos de lima esté lleno para el turno que viene. Tendrás limas de distintos tamaños que te darán distinta cantidad de gajos: puedes obtener 6 gajos de una lima "small", 8 gajos de una lima "medium" y 10 de una lima "large".
Mientras todavía necesites más gajos y todavía tengas más limas por cortar, toma la primera lima del array y resta la cantidad correspondiente de gajos a la cantidad que necesitas. Continúa hasta que ya no necesites más gajos o se te acaben las limas.
Implementa la función makeWedges(needed:limes:), que toma los argumentos needed, que contiene la cantidad 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 la cantidad de limas que cortaste.
makeWedges(needed: 25, limes: ["small", "small", "large", "medium", "small"])
// returns 4
¡Felicidades! Tu largo día de trabajo está por terminar y pronto irás a casa a trabajar en tu nueva app. Pero todavía tienes una serie de pedidos de bebidas por preparar antes de poder pasarle los pedidos al siguiente turno e irte.
Mientras todavía te quede tiempo en tu turno, debes preparar el primer pedido del array y luego quitar ese pedido del array.
Luego puedes restar la cantidad de tiempo que tomó preparar ese pedido, según tu función timeToPrepare(drinks:), del tiempo que te queda en tu turno.
Implementa la función finishShift(minutesLeft:remainingOrders:), que recibe la cantidad de minutos que te 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 alcanzaste a preparar antes de que terminara 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 beer y la soda se mantengan frescas, necesitas registrar 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, cuando recibe una lista de pedidos y horas, devuelve un par de tuplas opcionales que contienen las horas del primer y último pedido de beer y soda, junto con el número total de pedidos de cada una, y nil si no se hizo ningún pedido de esas bebidas. No necesitas registrar 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 contiene la primera y la última hora a la que se pidió beer, el número total de pedidos de beer, la primera y la última hora a la que se pidió soda, y el número total de pedidos de soda.
Se debe devolver con el formato de una tupla: (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.