Múltiples defer en el mismo scope se ejecutan en orden inverso al de su declaración (último en entrar, primero en salir):
func demo() {
defer { print("Ultimo defer: 3") }
defer { print("Segundo defer: 2") }
defer { print("Primer defer: 1") }
print("Cuerpo de la funcion")
}
demo()
// Cuerpo de la funcion
// Primer defer: 1
// Segundo defer: 2
// Ultimo defer: 3
defer con locks y recursos
class Cache {
private var datos: [String: String] = [:]
private let lock = NSLock()
func obtener(_ clave: String) -> String? {
lock.lock()
defer { lock.unlock() } // siempre se desbloquea
return datos[clave]
}
func guardar(_ valor: String, para clave: String) {
lock.lock()
defer { lock.unlock() }
datos[clave] = valor
}
}
defer para logging y métricas
func operacionCritica() throws {
let inicio = Date()
defer {
let duracion = Date().timeIntervalSince(inicio)
print("Duracion: (duracion)s")
}
// ... operacion
throw NSError(domain: "test", code: 1)
// el defer se ejecuta aunque se lance error
}
