PropertyWrapper: @LazyOnce
Иногда чтобы лучше разобраться в новой возможности языка можно написать свой велосипед свою реализацию того, что вы часто используете. Вот и мы решили написать свой @Lazy модификатор, который должен был повторить реализацию ключевого слова lazy. Правда в процессе мы добавили одну особенность — ленивое свойство не может быть перезаписано.
Из интересно, в реализации нам нужно было передать closure, в котором было бы скрыто ленивое создание объекта. Но проблема в том, что тип свойства wrappedValue должен совпадать с типом в методе init. Это требование @propertyWrapper.
Здесь на помощь приходит @autoclosure. Это позволяет передавать аргумент, который может быть как функцией () -> T, так и значением c типом T. Во втором случае значение будет завернуто в closure автоматически. Отсюда и название.
Пример использования: