Обозначение переменной Not Kotlin

В Kotlin существует ли более короткий синтаксис для этого кода:

if(swipeView == null){ swipeView = view.find<MeasureTypePieChart>(R.id.swipeableView) } 

Сначала я попробовал это:

  swipeView ?: view.find<MeasureTypePieChart>(R.id.swipeableView) 

но потом я понял, что это не задание, так что код ничего не делает. Затем я попробовал:

 swipeView = swipeView ?: view.find<MeasureTypePieChart>(R.id.swipeableView) 

Что работает, но это немного многословно. Я бы ожидал чего-то вроде этого:

 swipeView ?= view.find<MeasureTypePieChart> 

Но, к сожалению, это не работает. Есть ли способ сделать это с коротким синтаксисом?

Я знаю, что могу сделать это:

 variable?.let { it = something } which works. 

Более короткий синтаксис заключался бы в том, чтобы избежать того, чтобы swipeView никогда не был null .

Локальное значение

Если swipeView – это локальная переменная, вы можете объявить ее не нулевой при первоначальном назначении:

 val swipeView = ... ?: view.find<MeasureTypePieChart>(R.id.swipeableView) 

Аргумент функции

Если swipeView является аргументом функции, вы можете использовать аргумент по умолчанию, чтобы убедиться, что он никогда не имеет null :

 fun something(swipeView: View = view.find<MeasureTypePieChart>(R.id.swipeableView)) 

Свойство класса

Только для чтения

Если swipeView – это свойство класса только для чтения (т.е. val ), вы можете использовать встроенный Lazy Kotlin:

 val swipeView by lazy { view.find<MeasureTypePieChart>(R.id.swipeableView) } 

изменчивый

Если swipeView является изменяемым классом (т. swipeView ), вы можете определить свой собственный делегат, похожий на Lazy но изменяемый. например, на основе kotlin / Lazy.kt :

 interface MutableLazy<T> : Lazy<T> { override var value: T } fun <T> mutableLazy(initializer: () -> T): MutableLazy<T> = SynchronizedMutableLazyImpl(initializer) fun <T> mutableLazy(lock: Any?, initializer: () -> T): MutableLazy<T> = SynchronizedMutableLazyImpl(initializer, lock) operator fun <T> MutableLazy<T>.getValue(thisRef: Any?, property: KProperty<*>): T = value operator fun <T> MutableLazy<T>.setValue(thisRef: Any?, property: KProperty<*>, value: T) { this.value = value } private object UNINITIALIZED_VALUE private class SynchronizedMutableLazyImpl<T>(initializer: () -> T, lock: Any? = null) : MutableLazy<T>, Serializable { private var initializer: (() -> T)? = initializer @Volatile private var _value: Any? = UNINITIALIZED_VALUE // final field is required to enable safe publication of constructed instance private val lock = lock ?: this override var value: T get() { val _v1 = _value if (_v1 !== UNINITIALIZED_VALUE) { @Suppress("UNCHECKED_CAST") return _v1 as T } return synchronized(lock) { val _v2 = _value if (_v2 !== UNINITIALIZED_VALUE) { @Suppress("UNCHECKED_CAST") (_v2 as T) } else { val typedValue = initializer!!() _value = typedValue initializer = null typedValue } } } set(value) { val _v1 = _value if (_v1 !== UNINITIALIZED_VALUE) { _value = value } else synchronized(lock) { _value = value initializer = null } } override fun isInitialized(): Boolean = _value !== UNINITIALIZED_VALUE override fun toString(): String = if (isInitialized()) value.toString() else "MutableLazy value not initialized yet." } 

Применение:

 var swipeView by mutableLazy { view.find<MeasureTypePieChart>(R.id.swipeableView) } 

initializer swipeView только в том случае, если swipeView читается и еще не инициализирован (из предыдущего чтения или записи).

Intereting Posts
пакет для удаления змеи от детекта BottomSheetCallback из модального нижнего листа Должны быть объявлены локальные функции Котлина перед использованием Что такое поле для подбора Котлина? Как реорганизовать представление, чтобы разрешить фильтрацию элементов, привязанных к наблюдаемомуArrayList, внутри приложения tornadofx Преобразовать код RxJava в Kotlin правильно Элемент ItemViewModel TornadoFx имеет значение null Есть ли способ создать ненулевой массив из диапазона? Каковы зарезервированные ключевые слова в Котлине? Android RxJava onNext вызывается, даже если наблюдатель не подписан Использование констант kotlin в выражении java switch Kotlin: почему параметры конструктора имеют «внутреннюю» видимость по умолчанию? Как поместить элемент на карту и вернуть карту Ошибка возврата в Single В Kotlin почему аргумент по умолчанию не передается после того, как функция назначается переменной?