Ленивая инициализация - это функция программирования, которая должна быть у всех современных языков программирования. Однако то, как они реализуются, различается от одного к другому. Давайте сравним их между Kotlin и Swift.

Декларация

Котлин

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

val lazyString by lazy { "Lazy string" }

Таким образом, лямбда всегда нужна в Котлине lazy.

Быстрый

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

Примечание: закрытие в Swift аналогично Lambda в Kotlin

lazy var lazyString = “Lazy String”

Если нам нужно закрытие, мы тоже можем это сделать.

lazy var lazyString = {“Lazy String”}()

Изменчивость

Котлин

Котлин разрешает только неизменяемой переменной val быть ленивым. Это возможно, так как значение устанавливается через делегата, а lazyString - это просто свойство, которое устанавливается для получения с помощью функции делегата by.

val lazyString by lazy { "Lazy string" }

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

Быстрый

Swift не может иметь let для ленивой переменной, так как let необходимо установить значение во время инициализации. Следовательно, он должен быть изменяемым var.

lazy var lazyString = “Lazy String”

Преимущество этого в том, что после этого переменную можно изменить, хотя я думаю, что это само по себе ограничение.

Сфера

Котлин

Лениво инициализированная переменная может быть объявлена ​​в классе или функции. В любом месте.

Быстрый

Лениво инициализированная переменная может быть объявлена ​​только в классе или структуре. Ограниченное.

Безопасность потоков.

Котлин

По умолчанию переменная с отложенной инициализацией Kotlin является потокобезопасной. Его использование оказывает незначительное влияние на производительность.

Если бы можно было гарантировать, что он находится в одном потоке, функцию потокобезопасности можно было бы отключить с помощью LazyThreadSafetyMode.NONE

val lazyString by lazy(LazyThreadSafetyMode.NONE)

Вы можете проверить этот блог для более подробной информации.

Быстрый

Переменная с отложенной инициализацией не является потокобезопасной.

TL;DR;

Все причины перечисленных выше различий вызваны разным подходом к реализации.

В Kotlin нет специальной lazy языковой функции, вместо этого она выполняется функцией lazy через by функцию делегированного языка.

В Swift это языковая функция, где lazy - ключевое слово. Следовательно, реализация встроена в язык.

Надеюсь, этот пост будет вам полезен. Вы можете ознакомиться с другими моими интересными темами здесь.

Следуйте за мной в medium, Twitter, Facebook или Reddit за небольшими советами и изучение Android, Kotlin и т. д., связанные темы. ~ Эли ~