125 votes

Comment pouvons-nous retourner plusieurs valeurs à partir d'une fonction de Kotlin comme nous le faisons dans swift?

Comment puis-je retourner les 3 valeurs de données de même type(Int) à partir d'une fonction de Kotlin?

Je suis en train d'essayer de revenir le temps d'une journée, j'ai besoin de revenir à l'Heure, la Minute et la Seconde comme des entiers distincts, mais tous d'un coup à partir de la même fonction, est-ce possible?

Dans swift nous le faisons comme suit,

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

pouvons-nous atteindre cet objectif dans Kotlin?

P. S: je sais que je peux utiliser de Tableau ou table de hachage pour cela, mais je veux savoir si il existe quelque chose dans kotlin comme il est en swift.

199voto

zsmb13 Points 36441

Vous ne pouvez pas créer arbitraire de n-uplets dans Kotlin, au lieu de cela, vous pouvez utiliser des classes de données. Une option est d'utiliser le construit en Pair et Triple des classes qui sont génériques et peuvent tenir deux ou trois valeurs, respectivement. Vous pouvez utiliser ces combiné avec la déstructuration des déclarations comme ceci:

fun getPair() = Pair(1, "foo")

val (num, str) = getPair()

Vous pouvez également se déstructurent un List ou Array, pour le premier 5 éléments:

fun getList() = listOf(1, 2, 3, 4, 5)

val (a, b, c, d, e) = getList()

Les plus idiomatiques cependant, serait de définir votre propre classe de données, ce qui permet un retour significatif du type de votre fonction:

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

29voto

Ekeko Points 700

Il semble que vous êtes au courant de la réponse la plus évidente de la création d'une classe spécifique pour gérer le temps. Donc, je suppose que vous êtes en essayant d'éviter les petits tracas de la création d'une classe, ou d'accéder à chaque élément d'un tableau, etc. et sont à la recherche de la solution la plus courte en termes de code supplémentaire. Je vous suggère:

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

et l'utiliser avec la déconstruction:

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

Si vous avez besoin de 4 ou 5 valeurs de retour (vous ne pouvez pas déconstruire plus de 5), aller avec Array:

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

et

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

P. S.: vous pouvez utiliser moins de variables qu'il y a des valeurs lors de la déconstruction, comme var (a, b) = getTime() mais vous ne pouvez pas utiliser plus d'ou vous aurez une ArrayIndexOutOfBoundsException

23voto

Mahabub Karim Points 381

Alors que, généralement, une fonction peut renvoyer qu'une seule valeur, dans Kotlin, en tirant parti des avantages de la Paire, le type et la déstructuration des déclarations, on peut revenir à deux variables à partir d'une fonction. Considérons l'exemple suivant:

fun getUser():Pair<Int,String> {//(1) 
  return Pair(1,"Rivu") 
} 

fun main(args: Array<String>) { 
  val (userID,userName) = getUser()//(2) 
  println("User ID: $userID t User Name: $userName") 
} 

De: Fonctionnel Kotlin livre

6voto

Markus Penguin Points 864

Selon le Kotlin documentation (https://kotlinlang.org/docs/reference/multi-declarations.html#example-returning-two-values-from-a-function) vous pouvez l'obtenir comme ça:

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

3voto

Shruti Points 3073

vous pouvez retourner plusieurs valeurs comme indiqué ci-dessous

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

voir cette documentation

pour plus d'exemple, voir ce lien

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X