Обозначение переменной 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 читается и еще не инициализирован (из предыдущего чтения или записи).