Назад к вопросам
Junior
80
questionbank
Что такое lazy?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
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.
*/