SwiftIntermedio12 oct 2025
¡El 'Lazy' que No Se Actualiza! 😴
snippet.swift
class DocumentProcessor {
var documentName: String
var version: Int = 1
lazy var documentIdentifier: String = {
return "\(self.documentName)-v\(self.version)"
}()
init(name: String) {
self.documentName = name
}
func updateVersion() {
self.version += 1
}
}
let processor = DocumentProcessor(name: "MyImportantDoc")
print("--- First Access ---")
print("Identifier before update: \(processor.documentIdentifier)")
processor.updateVersion()
print("Updated document version to \(processor.version)")
print("\n--- Second Access ---")
print("Identifier after update: \(processor.documentIdentifier)")
processor.updateVersion()
print("Updated document version to \(processor.version)")
print("\n--- Third Access ---")
print("Identifier after second update: \(processor.documentIdentifier)")¿Qué crees que imprime?
✅ Salida Esperada
--- First Access ---
Identifier before update: MyImportantDoc-v1
Updated document version to 2
--- Second Access ---
Identifier after update: MyImportantDoc-v2
Updated document version to 3
--- Third Access ---
Identifier after second update: MyImportantDoc-v3⚠️ Salida Real
--- First Access ---
Identifier before update: MyImportantDoc-v1
Updated document version to 2
--- Second Access ---
Identifier after update: MyImportantDoc-v1
Updated document version to 3
--- Third Access ---
Identifier after second update: MyImportantDoc-v1¿Por qué pasa esto?
¡Aquí tenemos un clásico caso de **"El Mago Olvidadizo"**! 🧙♂️ Nuestro `documentIdentifier` es una propiedad `lazy`, lo que significa que su valor **solo se calcula una vez**, la primera vez que se accede a ella.
- Cuando lo imprimimos la primera vez (`Identifier before update`), el closure se ejecuta, captura `self.documentName` y `self.version` (que es `1`), y guarda "MyImportantDoc-v1". ¡Misión cumplida!
- Después, actualizamos `version` a `2`, y luego a `3`. Pensaríamos que al acceder `documentIdentifier` de nuevo, se recalcularía con la nueva versión, ¿verdad? ¡Pues no! 😱
- Como ya fue calculado una vez, Swift es como ese amigo que ya comió y no quiere más: te devuelve el valor **previamente calculado**, ignorando cualquier cambio posterior en `self.version`.
Es un comportamiento **intencional** para optimizar recursos, pero si no lo recuerdas, ¡te deja con datos más viejos que tu primera consola de videojuegos! 🎮
Conceptos relacionados
lazy-propertiesclosuresstate-management