El switch cubre todos los casos posibles o incluye default. Sin fall-through implícito. Admite rangos, tuplas y bindings:
let puntuacion = 73
switch puntuacion {
case 90...100: print("Sobresaliente")
case 70..<90: print("Notable")
case 50..<70: print("Aprobado")
default: print("Suspenso")
}
// Notable
// Tuplas en switch
let punto = (0, 1)
switch punto {
case (0, 0): print("Origen")
case (_, 0): print("Eje X")
case (0, _): print("Eje Y")
case let (x, y): print("((x), (y))")
}
// Eje Y
guard: salida temprana
guard evalúa una condición y sale del scope si no se cumple. El código resultante es más plano y legible que anidar ifs:
func procesar(nombre: String?) {
guard let n = nombre, !n.isEmpty else {
print("Nombre inválido"); return
}
print("Procesando: (n)")
}
procesar(nombre: nil) // Nombre inválido
procesar(nombre: "Ana") // Procesando: Ana
for-in con where, while y repeat-while
for i in 1...10 where i.isMultiple(of: 3) {
print(i) // 3, 6, 9
}
var n = 1
while n < 100 { n *= 2 }
print(n) // 128
var intentos = 0
repeat { intentos += 1 } while intentos < 3
print(intentos) // 3
Etiquetas de bucle
exterior: for i in 1...3 {
for j in 1...3 {
if i == 2 && j == 2 { break exterior }
print("(i),(j)", terminator: " ")
}
}
// 1,1 1,2 1,3 2,1
