我们如何快速返回Kotlin函数中的多个值?

如何从Kotlin函数中返回3个相同types(Int)的独立数据值?

我试图返回一天的时间,我需要返回小时,分钟和秒作为单独的整数,但所有在一个去从相同的function,这可能吗?

在迅速,我们这样做,

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

我们可以在Kotlin实现吗?

PS:我知道我可以使用Array或Hashmap来做这个,但是我想知道在kotlin中是否存在像swift一样的东西。

你不能在Kotlin中创建任意元组,相反,你可以使用数据类 。 一种选择是使用内置的PairTriple类,它们是通用的,可以分别保存两个或三个值。 你可以使用这些结合解构声明,如下所示:

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

您也可以解构一个ListArray ,最多可达到前五个元素 :

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

然而,最习惯的方式是定义你自己的数据类,它允许你从你的函数返回一个有意义的types:

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

根据Kotlin文档( https://kotlinlang.org/docs/reference/multi-declarations.html#example-returning-two-values-from-a-function ),你可以这样做:

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

您可以返回多个值,如下所示

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

看到这个文件

有关更多示例,请参阅此链接

Kotlin没有元组。 或者,您可以使用具有解构声明的 数据类 。

 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}") 

如果您不想为每个特定情况创建数据类,则可以创建一些通用数据类并使用typealias来清晰。

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

但是,显然缺点是你必须利用解构声明来给它一个合适的属性名称。

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

你似乎知道创建一个特定的类来处理时间的明显的答案。 所以我想你正试图避免创建一个类,或访问数组的每一个元素等小麻烦,并寻找额外的代码方面的最短的解决方案。 我会建议:

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

并与解构一起使用它:

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

如果你需要4或5个返回值(你不能解构超过5),去Array

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

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

PS:你可以在解构时使用比variables少的variables,比如var (a, b) = getTime()但是你不能使用更多的variables,否则你会得到一个ArrayIndexOutOfBoundsException