Sobes.tech
Junior

Kas ir lazy?

sobes.tech AI

Atbilde no AI

Atslēgas vārds lazy tiek izmantots novilcinātai īpašības inicializācijai.

Īpašība ar lazy tiek inicializēta tikai pirmās piekļuves brīdī. Tas ir noderīgi:

  • veiktspējai: ja objekta izveide prasa daudz resursu, bet tas nav vienmēr nepieciešams.
  • ciklisko atkarību novēršanai inicializācijas laikā.
  • darbam ar ārējiem resursiem vai datiem, kas var būt nepieejami objekta izveides laikā.

Lazy īpašības ir jābūt vai nu:

  • mainīgām (var), jo to vērtība var mainīties pirmās piekļuves laikā.
  • tām nedrīkst būt īpašības novērotāji (willSet, didSet) līdz pirmajai piekļuvei.
class HeavyResource {
    init() {
        print("Smaga resursa inicializācija")
        // Imitē resursu prasīgu inicializāciju
        Thread.sleep(forTimeInterval: 1)
    }
}

class MyPresenter {
    let name = "Presenter"

    // lazy īpašība, inicializējas pirmās lietošanas laikā
    lazy var heavyResource: HeavyResource = {
        print("Veido smago resursu")
        return HeavyResource()
    }()

    init() {
        print("\(name) inicializēts")
    }

    func accessResource() {
        print("Pieeja smagam resursam...")
        _ = heavyResource // Šeit notiek lazy īpašības inicializācija
        print("Resurss piekļūts.")
    }
}

// Inicializē presenter
let presenter = MyPresenter() // Izvade: Presenter inicializēts

// Piekļuve resursam vēlāk, kad tas tiešām ir nepieciešams
presenter.accessResource()
/*
Izvade:
Pieeja smagam resursam...
Veido smago resursu
Smaga resursa inicializācija
Resurss piekļūts.
*/

// Atkārtota piekļuve neizraisa atkārtotu inicializāciju
presenter.accessResource()
/*
Izvade:
Pieeja smagam resursam...
Resurss piekļūts.
*/