es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Kotlin múltiple declaración when.

Estoy aprendiendo a construir una aplicación simple de Android con Android Studio y creé una función para encontrar el id de algunos valores. Mientras escribía esta función, pensé en usar la declaración “when” (Kotlin), pero lamentablemente tuve que repetirla. ¿Hay alguna manera de asignar el resultado de una declaración “when” a varias variables al mismo tiempo? En otros lenguajes, simplemente habría devuelto una lista que habría desarmado, pero no puedo encontrar una manera de hacerlo en Kotlin. No es realmente un problema importante, pero me gusta optimizar mi código.

// mi función de Kotlin
// estableciendo un estado específico
private fun setState(num: Int) {
Log.v(TAG, num.toString())
// obtener el id de imagen correcto
val imageId: Int? = when (num) {
0 -> R.drawable.lemon_restart
1 -> R.drawable.lemon_tree
2 -> R.drawable.lemon_squeeze
3 -> R.drawable.lemon_drink
else -> null
}
// obtener el texto correcto para mostrar
val txtId: Int? = when (num) {
0 -> R.string.txt_state_0
1 -> R.string.txt_state_1
2 -> R.string.txt_state_2
3 -> R.string.txt_state_3
else -> null
}
// obtener la descripción de contenido correcta para accesibilidad
val contentDescriptionId: Int? = when (num) {
0 -> R.string.lemon_restart_description
1 -> R.string.lemon_tree_description
2 -> R.string.lemon_squeeze_description
3 -> R.string.lemon_drink_description
else -> null
}
// establecer lo nuevo
val imView: ImageView = findViewById(R.id.imageState)
val txtView: TextView = findViewById(R.id.textOrder)
txtView.text = getString(txtId!!)
imView.setImageResource(imageId!!)
imView.contentDescription = getString(contentDescriptionId!!)
}

Siéntase libre de optimizarlo tanto como sea posible.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Sí, hay una forma de asignar el resultado de una sentencia “when” a múltiples variables al mismo tiempo en Kotlin. Esto se puede lograr utilizando declaraciones de destrucción.

    Aquí hay una versión optimizada del código que usa declaraciones de destrucción:

    private fun setState(num: Int) {
        Log.v(TAG, num.toString())
    
        // utiliza declaraciones de destrucción para asignar múltiples variables al mismo tiempo
        val (imageId, txtId, contentDescriptionId) = when (num) {
            0 -> Triple(R.drawable.lemon_restart, R.string.txt_state_0, R.string.lemon_restart_description)
            1 -> Triple(R.drawable.lemon_tree, R.string.txt_state_1, R.string.lemon_tree_description)
            2 -> Triple(R.drawable.lemon_squeeze, R.string.txt_state_2, R.string.lemon_squeeze_description)
            3 -> Triple(R.drawable.lemon_drink, R.string.txt_state_3, R.string.lemon_drink_description)
            else -> Triple(null, null, null)
        }
    
        val imView: ImageView = findViewById(R.id.imageState)
        val txtView: TextView = findViewById(R.id.textOrder)
    
        // accede de manera segura a las variables utilizando el operador elvis
        txtView.text = getString(txtId ?: R.string.default_text)
        imView.setImageResource(imageId ?: R.drawable.default_image)
        imView.contentDescription = getString(contentDescriptionId ?: R.string.default_description)
    }
    

    En la versión optimizada, utilizamos la función Triple para devolver tres valores de la sentencia when como un solo objeto. Luego, utilizamos declaraciones de destrucción para asignar los valores a múltiples variables al mismo tiempo.

    También utilizamos el operador elvis (?:) para acceder de manera segura a las variables y proporcionar valores predeterminados si alguna de ellas es nula.

    En general, esta versión del código es más concisa y más fácil de leer.

Comments are closed.