defer con errores y retornos anticipados
Asegure la limpieza incluso al lanzar errores o retornar anticipadamente.
defer con errores y retornos anticipados es una lección gratuita de Swift Academy en CoddyKit. Esta es la lección 4 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Swift Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Swift Academy incluye 4 lecciones en total.
defer se ejecuta al hacer return
Un bloque defer se ejecuta incluso cuando la función termina antes de tiempo mediante return.
func check(_ value: Int) {
defer { print("cleanup ran") }
if value < 0 {
print("negative, returning early")
return
}
print("value is", value)
}
check(-5)Limpieza en todas las rutas
Independientemente de qué return se ejecute, la limpieza diferida se realiza exactamente una vez.
func classify(_ n: Int) {
defer { print("done classifying") }
if n == 0 { print("zero"); return }
if n > 0 { print("positive"); return }
print("negative")
}
classify(0)defer se ejecuta al hacer throw
Cuando una función lanza un error, los defer registrados se siguen ejecutando mientras se deshace el ámbito.
enum MyError: Error { case bad }
func risky(_ fail: Bool) throws {
defer { print("cleanup on the way out") }
if fail { throw MyError.bad }
print("no failure")
}
try? risky(true)Combinación de return y throw
Tanto si la función devuelve el control normalmente como si lanza un error, se ejecuta el mismo defer.
enum E: Error { case oops }
func op(_ flag: Bool) throws -> Int {
defer { print("op finishing") }
if flag { throw E.oops }
return 42
}
let r = try? op(false)
print(r ?? -1)Limpieza antes de propagar el error
El defer se ejecuta antes de que el error lanzado llegue a quien llamó a la función, por lo que los recursos se liberan primero.
enum E: Error { case fail }
func load(_ broken: Bool) throws {
print("open")
defer { print("close") }
if broken { throw E.fail }
print("read")
}
do {
try load(true)
} catch {
print("caught:", error)
}Protección con defer
Un patrón habitual es adquirir el recurso, programar la limpieza con defer y después usar guard, cuyos retornos anticipados seguirán activando la limpieza.
func process(_ items: [Int]) {
print("start")
defer { print("finished") }
guard !items.isEmpty else {
print("nothing to do")
return
}
print("processing", items.count, "items")
}
process([])defer y los bucles que lanzan errores
Un defer dentro de un bucle se ejecuta al final de cada iteración, incluso si una instrucción posterior lanza un error.
enum E: Error { case stop }
func loop() throws {
for i in 1...3 {
defer { print("end", i) }
if i == 2 { throw E.stop }
print("body", i)
}
}
try? loop()Orden con retorno anticipado
Varios defer se siguen ejecutando en orden LIFO al devolver el control antes de tiempo.
func multi(_ skip: Bool) {
defer { print("A") }
defer { print("B") }
if skip { return }
print("body")
}
multi(true)Registro de errores
Use defer para registrar de forma coherente la finalización o el error en todas las rutas de salida.
enum E: Error { case bad }
func attempt(_ fail: Bool) throws {
var success = false
defer { print("attempt success:", success) }
if fail { throw E.bad }
success = true
}
try? attempt(true)Restauración del estado al hacer throw
defer es ideal para deshacer cambios temporales de estado cuando una operación lanza un error.
enum E: Error { case fail }
func transaction(_ fail: Bool) throws {
var inProgress = true
defer { inProgress = false; print("inProgress:", inProgress) }
if fail { throw E.fail }
print("committed")
}
try? transaction(true)Práctica recomendada
Confíe en defer para la limpieza que deba realizarse pese a retornos anticipados y errores lanzados, de modo que ninguna ruta de salida provoque fugas de recursos.
enum E: Error { case x }
func safe(_ fail: Bool) throws {
print("acquire")
defer { print("release") }
if fail { throw E.x }
print("use")
}
try? safe(true)Comprobación rápida
Pruebe defer con errores y retornos.
Resumen
defer se ejecuta al salir de cualquier ámbito, incluso mediante un return anticipado o un error lanzado, antes de que el error se propague. Esto lo convierte en el lugar fiable para realizar la limpieza y restaurar el estado en todas las rutas de salida, conservando el orden LIFO.
func f(_ skip: Bool) {
defer { print("cleanup") }
if skip { return }
print("work")
}
f(true)Preguntas frecuentes
¿La lección «defer con errores y retornos anticipados» es gratis?
Sí — el texto completo de «defer con errores y retornos anticipados» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Swift Academy, actualiza a CoddyKit PRO. El curso de Swift Academy incluye 4 lecciones en total.
¿Qué aprenderé en «defer con errores y retornos anticipados»?
Asegure la limpieza incluso al lanzar errores o retornar anticipadamente. Practicas Swift Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar Swift Academy?
No se requiere experiencia previa. Swift Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 4 de 4.
¿Cuánto tiempo toma la lección «defer con errores y retornos anticipados»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de Swift Academy?
Sí. Cada lección de Swift Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Cómo funciona defer
- Orden de varios bloques defer
- defer para liberar recursos
- defer con errores y retornos anticipados