Назад к вопросам

Ответ от нейросети

sobes.tech AI

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

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

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

lazy-свойства должны быть либо:

  • Переменными (var), так как их значение может измениться при первом доступе.
  • Не иметь наблюдателей свойств (willSet, didSet) до первого доступа.
class HeavyResource {
    init() {
        print("Heavy resource initialized")
        // Имитация ресурсоемкой инициализации
        Thread.sleep(forTimeInterval: 1)
    }
}

class MyPresenter {
    let name = "Presenter"

    // lazy-свойство, инициализируется при первом использовании
    lazy var heavyResource: HeavyResource = {
        print("Creating heavy resource")
        return HeavyResource()
    }()

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

    func accessResource() {
        print("Accessing heavy resource...")
        _ = heavyResource // Здесь происходит инициализация lazy-свойства
        print("Resource accessed.")
    }
}

// Инициализируем presenter
let presenter = MyPresenter() // Вывод: Presenter initialized

// Доступ к ресурсу происходит позже, когда он действительно нужен
presenter.accessResource()
/*
Вывод:
Accessing heavy resource...
Creating heavy resource
Heavy resource initialized
Resource accessed.
*/

// Повторный доступ не вызывает повторной инициализации
presenter.accessResource()
/*
Вывод:
Accessing heavy resource...
Resource accessed.
*/