Sobes.tech
Junior

Lazy чист?

sobes.tech AI

Ҷавоб аз AI

Ключовата дума lazy се използва за отложена инициализация на свойство.

Свойство с lazy се инициализира само при първия му достъп. Това е полезно за:

  • Производителност: ако създаването на обекта изисква много ресурси, но не винаги е необходимо.
  • Избягване на циклични зависимости по време на инициализация.
  • Работа с външни ресурси или данни, които може да не са налични при създаването на обекта.

lazy свойствата трябва да бъдат:

  • Променливи (var), тъй като стойността им може да се промени при първия достъп.
  • Без наблюдатели (willSet, didSet) до първия достъп.
class HeavyResource {
    init() {
        print("Тежкият ресурс е инициализиран")
        // Симулация на скъпа инициализация
        Thread.sleep(forTimeInterval: 1)
    }
}

class MyPresenter {
    let name = "Presenter"

    // lazy свойство, инициализира се при първо използване
    lazy var heavyResource: HeavyResource = {
        print("Създаване на тежкия ресурс")
        return HeavyResource()
    }()

    init() {
        print("\(name) е инициализиран")
    }

    func accessResource() {
        print("Достъп до тежкия ресурс...")
        _ = heavyResource // Тук се случва инициализацията на lazy свойството
        print("Ресурсът е достъпен")
    }
}

// Инициализираме презентъра
let presenter = MyPresenter() // Изход: Prezentator inicializiran

// Достъпът до ресурса става по-късно, когато наистина е необходим
presenter.accessResource()
/*
Изход:
Достъп до тежкия ресурс...
Създаване на тежкия ресурс
Тежкият ресурс е инициализиран
Ресурсът е достъпен
*/

// Повторният достъп не причинява повторна инициализация
presenter.accessResource()
/*
Изход:
Достъп до тежкия ресурс...
Ресурсът е достъпен
*/