Что такое lazy var? Для чего она используется?ios-42

lazy var — это ключевое слово в Swift, обозначающее отложенную (ленивую) инициализацию свойства. Это значит, что значение такого свойства вычисляется только при первом обращении к нему, а не во время создания экземпляра объекта.

Основные особенности lazy var

  1. Инициализация при первом доступе

    • Обычные var инициализируются сразу при создании объекта.
    • lazy var откладывает вычисление значения до момента, когда оно действительно понадобится.
  2. Используется только с var

    • lazy нельзя применять к let, потому что значение должно быть изменяемым на этапе инициализации.
  3. Не потокобезопасна по умолчанию

    • Если несколько потоков обратятся к lazy var одновременно до инициализации, это может привести к race condition.

Когда использовать lazy var?

1. Ресурсоемкая инициализация

Если свойство требует сложных вычислений или загрузки данных, его можно сделать lazy, чтобы не замедлять создание объекта.

class ImageLoader {
    lazy var processedImage: UIImage = {
        print("Вычисляем изображение...")
        return self.applyFilters(to: UIImage(named: "photo")!)
    }()

    private func applyFilters(to image: UIImage) -> UIImage {
        // Дорогие операции с изображением
        return image
    }
}

2. Зависимость от других свойств

Если свойство зависит от других полей класса, которые могут быть не готовы при инициализации.

class Person {
    var name: String
    lazy var greeting: String = {
        return "Привет, \(self.name)!"
    }()

    init(name: String) {
        self.name = name
    }
}

3. Оптимизация памяти

Полезно, если свойство используется редко — зачем выделять память заранее?

Ограничения lazy var

  • Не работает со структурами (struct) в immutable контексте.
  • Не подходит для вычисляемых свойств (только для хранимых).

Пример ошибки

Если попытаться использовать lazy с let:

lazy let constant: Int = 42 // Ошибка: 'lazy' cannot be used on a let

Резюмируем:


lazy var — мощный инструмент для оптимизации производительности и управления памятью, но требует аккуратного использования, особенно в многопоточной среде.