PropertyWrapper: @LazyOnce

Tinkoff@here
1 min readSep 23, 2020

Иногда чтобы лучше разобраться в новой возможности языка можно написать свой велосипед свою реализацию того, что вы часто используете. Вот и мы решили написать свой @Lazy модификатор, который должен был повторить реализацию ключевого слова lazy. Правда в процессе мы добавили одну особенность — ленивое свойство не может быть перезаписано.

Из интересно, в реализации нам нужно было передать closure, в котором было бы скрыто ленивое создание объекта. Но проблема в том, что тип свойства wrappedValue должен совпадать с типом в методе init. Это требование @propertyWrapper.

Здесь на помощь приходит @autoclosure. Это позволяет передавать аргумент, который может быть как функцией () -> T, так и значением c типом T. Во втором случае значение будет завернуто в closure автоматически. Отсюда и название.

Пример использования:

--

--

Tinkoff@here

Мобильная команда Тинькофф вещает! 😎