Asignación variable de nula Kotlin

En Kotlin, ¿hay alguna syntax más corta para este código?

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

Primero intenté esto:

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

pero luego me di count de que no era una tarea, así que ese código no hace nada. Entonces probé:

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

Lo cual funciona, pero es un poco detallado. Esperaría algo como esto:

 swipeView ?= view.find<MeasureTypePieChart> 

Pero desafortunadamente eso no funciona. ¿Hay alguna forma de lograr esto con una breve syntax?

Sé que puedo hacerlo:

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

Una syntax más corta sería evitar que swipeView sea null alguna vez.

Variable local

Si swipeView es una variable local, puede declararla como no nula cuando la asigne inicialmente:

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

Argumento de la function

Si swipeView es un argumento de function, entonces puedes usar un argumento pnetworkingeterminado para asegurarte de que nunca sea null :

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

Propiedad de class

Solo lectura

Si swipeView es una propiedad de class de solo lectura (es decir, val ), entonces puede usar el Lazy incorporado de Kotlin:

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

Mudable

Si swipeView es una propiedad de class mutable (es decir, var ), entonces puede definir su propio delegado similar a Lazy pero mutable. Por ejemplo, lo siguiente se basa en 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 requinetworking 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." } 

Uso:

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

El initializer solo se swipeView si swipeView se lee y aún no se ha inicializado (de una lectura o escritura anterior).

  • Afirmación no nula de Kotlin en nulo
  • Requerir en la superclass 'init block plantea IllegalArgumentException
  • ¿Se puede convertir un campo en una versión no nula de sí mismo?
  • La mejor forma de comprobar null en kotlin?
  • Manera idiomática de manejar lists anulables o vacías en Kotlin
  • Kotlin comtesting null dos veces en caso de que no
  • ¿Cómo probar idiomáticamente cadenas no nulas y no vacías en Kotlin?
  • kotlin reflexión verificación nullable types
  • ¿Cómo puedo crear una instancia de un object usando valores de parameters de constructor pnetworkingeterminados en Kotlin?
  • Kotlin - lateinit VS Cualquiera? = nulo
  • Combine security nula y assertNotNull