如何从Kotlin中的函数返回3个相同类型(Int)的单独数据值?
我试图返回一天中的时间,我需要将小时,分钟和秒作为单独的整数返回,但是所有这一切都来自同一个函数,这可能吗?
在swift中我们就像下面一样,
func getTime() -> (Int, Int, Int) {
...
return ( hour, minute, second)
}
我们能在Kotlin实现吗?
P.S:我知道我可以使用Array或Hashmap,但我想知道kotlin中是否存在类似swift的内容。
答案 0 :(得分:53)
您无法在Kotlin中创建任意元组,而是可以使用data classes。一种选择是使用内置的Pair
和Triple
类,这些类是通用的,并且可以分别保存两个或三个值。您可以将这些与destructuring declarations结合使用,如下所示:
fun getPair() = Pair(1, "foo")
val (num, str) = getPair()
您还可以对List
或Array
进行解构,直到第一个5 elements:
fun getList() = listOf(1, 2, 3, 4, 5)
val (a, b, c, d, e) = getList()
然而,最常用的方法是定义自己的数据类,它允许您从函数中返回有意义的类型:
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()
答案 1 :(得分:1)
根据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()
答案 2 :(得分:1)
您似乎意识到创建特定类来处理时间的明显答案。所以我想你正在努力避免创建类,或访问数组的每个元素等的小麻烦,并且正在寻找额外代码方面的最短解决方案。我建议:
fun getTime(): Triple<Int, Int, Int> {
...
return Triple( hour, minute, second)
}
并使用它解构:
var (a, b, c) = getTime()
如果您需要4或5个返回值(不能解构超过5个),请使用Array
:
fun getTime(): Array<Int> {
...
return arrayOf( hour, minute, second, milisec)
}
和
var (a, b, c, d) = getTime()
P.S。:您可以使用较少的变量而不是解构时的值,例如var (a, b) = getTime()
,但您不能使用更多或者您将获得ArrayIndexOutOfBoundsException
答案 3 :(得分:1)
使用三键返回3个值,使用对返回2个值
class Book(val title: String, val author: String, val year: Int) {
fun getTitleAuthor(): Pair<String, String> {
return (title to author)
}
fun getTitleAuthorYear(): Triple<String, String, Int> {
return Triple(title, author, year)
}}
答案 4 :(得分:0)
您可以返回多个值,如下所示
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(...)
请参阅此documentation
有关更多示例,请参阅此link
答案 5 :(得分:0)
Kotlin没有元组。或者,您可以将data class与destructuring declaration一起使用。
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<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>
但是,显然,缺点是你必须使用解构声明才能给它一个合适的属性名称。
val time = getTime()
println("${time.a}:${time.b}:${time.c}")
val (hour, minute, second) = getTime() //destructuring declaration
println("${hour}:${minute}:${second}")
答案 6 :(得分:0)
通常,在Kotlin中,函数只能返回一个值,这是通过利用Pair类型和解构声明的好处,我们可以从函数返回两个变量。考虑以下示例:
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")
}
来自:实用科特林书