¿Cómo devolvemos valores múltiples de una function en Kotlin como lo hacemos en swift?

¿Cómo devuelvo 3 valores de datos separados del mismo tipo (Int) de una function en Kotlin?

Estoy intentando regresar a la hora del día, necesito devolver la Hora, el Minuto y el Segundo como integers separados, pero todo en uno va desde la misma function, ¿es esto posible?

En rápido lo hacemos como seguir,

func getTime() -> (Int, Int, Int) { ... return ( hour, minute, second) } 

podemos lograr esto en Kotlin?

PD: Sé que puedo usar Array o Hashmap para esto, pero quiero saber si existe algo en kotlin como si fuera rápido.

No puede crear tuplas arbitrarias en Kotlin; en su lugar, puede usar classs de datos . Una opción es usar las classs incorporadas en Pair y Triple que son genéricas y pueden contener dos o tres valores, respectivamente. Puede usar estos combinados con declaraciones de desestructuración como esta:

 fun getPair() = Pair(1, "foo") val (num, str) = getPair() 

También puede desestructurar una List o Array , hasta para los primeros 5 elementos :

 fun getList() = listOf(1, 2, 3, 4, 5) val (a, b, c, d, e) = getList() 

Sin embargo, la forma más idiomática sería definir su propia class de datos, que le permite devolver un tipo significativo de su function:

 data class Time(val hour: Int, val minute: Int, val second: Int) fun getTime(): Time { ... return Time(hour, minute, second) } val (hour, minute, second) = getTime() 

De acuerdo con la documentation de Kotlin ( https://kotlinlang.org/docs/reference/multi-declarations.html#example-returning-two-values-from-a-function ) puede lograrlo así:

 data class TimeData(val hour: Int, val minute: Int, val second: Int) fun getTime(): TimeData { // do your calculations return TimeData(hour, minute, second) } // Get the time. val (hour, minute, second) = getTime() 

puede devolver varios valores como se muestra a continuación

 data class Result(val result: Int, val status: Status) fun function(...): Result { // computations return Result(result, status) } // Now, to use this function: val (result, status) = function(...) 

ver esta documentation

para ver más ejemplos, mira este enlace

No hay tupla en Kotlin. Alternativamente, puede usar la class de datos con la statement de desestructuración .

 data class Time(val hour: Int, val minute: Int, val second: Int) func getTime(): Time { ... return Time(hour, minute, second) } //Usage val time = getTime() println("${time.hour}:${time.minute}:${time.second}") //Or val (hour, minute, second) = getTime() println("${hour}:${minute}:${second}") 

Si no desea crear una class de datos para cada caso específico, puede crear algunas classs de datos generics y usar typealias para mayor claridad.

 data class Two<A, B>(val a: A, val b: B) data class Three<A, B, C>(val a: A, val b: B, val c: C) data class Four<A, B, C, D>(val a: A, val b: B, val c: C, val d: D) ... typealias Time = Three<Int, Int, Int> 

Pero, obviamente, la desventaja es que debe hacer uso de la statement de desestructuración para darle un nombre de propiedad adecuado.

 val time = getTime() println("${time.a}:${time.b}:${time.c}") val (hour, minute, second) = getTime() //destructuring declaration println("${hour}:${minute}:${second}") 

Parece que conoce la respuesta obvia de crear una class específica para manejar el time. Así que supongo que está tratando de evitar la pequeña molestia de crear una class, o acceder a cada elemento de una matriz, etc. y está buscando la solución más corta en términos de código adicional. Yo sugeriría:

 fun getTime(): Triple<Int, Int, Int> { ... return Triple( hour, minute, second) } 

y usarlo con la deconstrucción:

 var (a, b, c) = getTime() 

Si necesita 4 o 5 valores devueltos (no puede debuild más de 5), vaya con Array :

 fun getTime(): Array<Int> { ... return arrayOf( hour, minute, second, milisec) } 

y

 var (a, b, c, d) = getTime() 

PD: puedes usar less variables que valores al debuild, como var (a, b) = getTime() pero no puedes usar más o obtendrás una ArrayIndexOutOfBoundsException

  • diferencia entre diversión en el bloque de object compañero y fuera de class en kotlin?
  • Cómo mostrar correctamente el progreso de las tareas asíncronas utilizadas por la Sala de Google
  • ¿Cómo generar serialVersionUID para excepciones kotlin?
  • kotlin: cómo puedo llamar a la function desde la expresión del object
  • Ejemplo de liquidación Corda
  • Clases de datos de Kotlin: por qué toString () exporta properties privadas
  • Error del comstackdor Java al vincular con el comstackdor de kotlin utilizando ant
  • Kotlin: ¿usar una lambda en lugar de una interfaz funcional?
  • Hello World en KotlinJS falla con Kotlin no está definido
  • ¿Cómo declarar los types sin procesar en Kotlin?
  • Cómo depurar el error "No se pudo resolver com.google.android:android" en Anko