Отложенная или ленивая инициализация lazy

Свойства с отложенной инициализацией или свойства ленивого хранения — свойство, начальное значение которого не рассчитывается до первого использования. Индикатор ленивого свойства — ключевое слово lazy.

Ленивые свойства полезны, когда исходное значение свойства зависит от внешних факторов, значения которых неизвестны до окончания инициализации. Так же ленивые свойства полезны, когда начальное значение требует комплексных настроек или сложных вычислений, которые не должны быть проведены до того момента, пока они не понадобятся.

Т.е. свойства с отложенной инициализацией удовлетворяют правилу: «Все свойства должны быть инициализированы» и инициализация свойства происходит уже после инициализации класса. Поэтому в качестве инициализатора мы можем вызвать метод класса. И это будет законно, т.к. класс со всеми методами уже инициализирован.

Вот пример из книги по Swift от Apple:

//
// apple.com
//

class TransferImage {
    //TransferImage - класс для переноса картинки с внешних источников на устройство
    //Считаем, что классу требуется большое количество времени для инициализации
var fileName = "data.txt"
    //класс TransferImage функционал данных будет описан тут
}
 
class DataManager {
    lazy var transporter = TransferImage()
    var data = [String]()
    //класс DataManager обеспечит необходимую функциональность тут
}
 
let manager = DataManager()
manager.data.append("Some data")
manager.data.append("Some more data")
//экземпляр класса TransferImage для свойства transporter еще не создано

При декларировании можно также поставит знак «=» и { } т.е. присвоить замыкание. Оно также не выполнится до тех пор, пока кто нибудь не обратится к этому свойству.

Важно помнить lazy свойства могут быть только var. Не могут быть let.

Метки:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

*

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.