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).

  • ¿Kotlin no se puede anular valor puede ser nulo?
  • Kotlin security nula?
  • Requerir en la superclass 'init block plantea IllegalArgumentException
  • ¿Cómo probar idiomáticamente cadenas no nulas y no vacías en Kotlin?
  • Kotlin null-check error
  • Kotlin .let {} nulo error de security supuestamente falso
  • ¿Cómo definir un miembro delegado que se puede anotar en Kotlin?
  • Kotlin con si no es nulo
  • Afirmación no nula de Kotlin en nulo
  • Kotlin: No se pueden aplicar dos condicionales a la vez. Verificar con el estilo de function de "cuerpo de retorno".
  • Kotlin null-safety para properties de class