Sobes.tech
Junior

Co to jest lazy?

sobes.tech AI

Odpowiedź od AI

Słowo kluczowe lazy jest używane do opóźnionej inicjalizacji właściwości.

Właściwość z lazy jest inicjalizowana tylko przy pierwszym dostępie do niej. Jest to przydatne do:

  • Wydajności: jeśli tworzenie obiektu wymaga dużo zasobów, ale nie zawsze jest konieczne.
  • Unikania cyklicznych zależności podczas inicjalizacji.
  • Pracy z zasobami zewnętrznymi lub danymi, które mogą nie być dostępne podczas tworzenia obiektu.

Właściwości lazy powinny być:

  • Zmiennymi (var), ponieważ ich wartość może się zmienić przy pierwszym dostępie.
  • Bez obserwatorów właściwości (willSet, didSet) do pierwszego dostępu.
class HeavyResource {
    init() {
        print("Inicjalizacja ciężkiego zasobu")
        // Symulacja kosztownej inicjalizacji
        Thread.sleep(forTimeInterval: 1)
    }
}

class MyPresenter {
    let name = "Presenter"

    // właściwość lazy, inicjalizuje się przy pierwszym użyciu
    lazy var heavyResource: HeavyResource = {
        print("Tworzenie ciężkiego zasobu")
        return HeavyResource()
    }()

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

    func accessResource() {
        print("Dostęp do ciężkiego zasobu...")
        _ = heavyResource // Tu następuje inicjalizacja właściwości lazy
        print("Zasób dostępny")
    }
}

// Inicjalizacja prezentera
let presenter = MyPresenter() // Wyjście: Presenter zainicjalizowany

// Dostęp do zasobu następuje później, gdy jest naprawdę potrzebny
presenter.accessResource()
/*
Wyjście:
Dostęp do ciężkiego zasobu...
Tworzenie ciężkiego zasobu
Inicjalizacja ciężkiego zasobu
Zasób dostępny
*/

// Powtórny dostęp nie wywołuje ponownej inicjalizacji
presenter.accessResource()
/*
Wyjście:
Dostęp do ciężkiego zasobu...
Zasób dostępny
*/