Sobes.tech
Junior

Kas yra lazy?

sobes.tech AI

Atsakymas iš AI

Raktinis žodis lazy naudojamas vėluotai inicializacijai savybėje.

Savybė su lazy inicializuojama tik pirmojo prieigos metu. Tai naudinga:

  • našumui: jei objekto kūrimas reikalauja daug išteklių, bet ne visada būtina.
  • ciklinių priklausomybių išvengimui inicializacijos metu.
  • darbui su išoriniais ištekliais ar duomenimis, kurie gali būti neprieinami kuriant objektą.

Lazy savybės turi būti arba:

  • kintamos (var), nes jų reikšmė gali pasikeisti pirmojo prieigos metu.
  • neturi turėti stebėtojų (willSet, didSet) iki pirmojo prieigos.
class HeavyResource {
    init() {
        print("Sunkusis išteklius inicializuotas")
        // Imituojama išteklių imli inicializacija
        Thread.sleep(forTimeInterval: 1)
    }
}

class MyPresenter {
    let name = "Presenter"

    // lazy savybė, inicializuojama pirmojo naudojimo metu
    lazy var heavyResource: HeavyResource = {
        print("Kuriamas sunkusis išteklius")
        return HeavyResource()
    }()

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

    func accessResource() {
        print("Prieiga prie sunkio ištekliaus...")
        _ = heavyResource // Čia įvyksta lazy savybės inicializacija
        print("Išteklius pasiektas.")
    }
}

// Inicializuojame presenterį
let presenter = MyPresenter() // Išves: Presenter inicializuotas

// Prieiga prie ištekliaus vėliau, kai ji tikrai reikalinga
presenter.accessResource()
/*
Išves:
Prieiga prie sunkio ištekliaus...
Kuriamas sunkusis išteklius
Sunkusis išteklius inicializuotas
Išteklius pasiektas.
*/

// Pakartotinė prieiga ne sukelia pakartotinės inicializacijos
presenter.accessResource()
/*
Išves:
Prieiga prie sunkio ištekliaus...
Išteklius pasiektas.
*/