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