Sobes.tech
Junior

Cos'è lazy?

sobes.tech AI

Risposta dell'AI

La parola chiave lazy viene utilizzata per l'inizializzazione differita di una proprietà.

Una proprietà con lazy viene inizializzata solo al primo accesso. Questo è utile per:

  • Prestazioni: se la creazione dell'oggetto richiede molte risorse, ma non sempre è necessaria.
  • Evitare dipendenze cicliche durante l'inizializzazione.
  • Lavorare con risorse esterne o dati che potrebbero non essere disponibili al momento della creazione dell'oggetto.

Le proprietà lazy devono essere:

  • Variabili (var), poiché il loro valore può cambiare al primo accesso.
  • Senza osservatori di proprietà (willSet, didSet) fino al primo accesso.
class HeavyResource {
    init() {
        print("Risorsa pesante inizializzata")
        // Simulazione di inizializzazione costosa
        Thread.sleep(forTimeInterval: 1)
    }
}

class MyPresenter {
    let name = "Presenter"

    // proprietà lazy, inizializzata al primo utilizzo
    lazy var heavyResource: HeavyResource = {
        print("Creazione risorsa pesante")
        return HeavyResource()
    }()

    init() {
        print("\(name) inizializzato")
    }

    func accessResource() {
        print("Accesso alla risorsa pesante...")
        _ = heavyResource // Qui avviene l'inizializzazione della proprietà lazy
        print("Risorsa accessibile.")
    }
}

// Inizializziamo il presenter
let presenter = MyPresenter() // Output: Presenter initialized

// L'accesso alla risorsa avviene più tardi, quando realmente necessario
presenter.accessResource()
/*
Output:
Accesso alla risorsa pesante...
Creazione risorsa pesante
Risorsa pesante inizializzata
Risorsa accessibile.
*/

// L'accesso ripetuto non provoca una ri-inizializzazione
presenter.accessResource()
/*
Output:
Accesso alla risorsa pesante...
Risorsa accessibile.
*/