我们如何在swot中返回Kotlin函数中的多个值?

时间:2017-11-15 12:45:06

标签: android kotlin

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

我试图返回一天中的时间,我需要将小时,分钟和秒作为单独的整数返回,但是所有这一切都来自同一个函数,这可能吗?

在swift中我们就像下面一样,

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

我们能在Kotlin实现吗?

P.S:我知道我可以使用Array或Hashmap,但我想知道kotlin中是否存在类似swift的内容。

7 个答案:

答案 0 :(得分:53)

您无法在Kotlin中创建任意元组,而是可以使用data classes。一种选择是使用内置的PairTriple类,这些类是通用的,并且可以分别保存两个或三个值。您可以将这些与destructuring declarations结合使用,如下所示:

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

val (num, str) = getPair()

您还可以对ListArray进行解构,直到第一个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 classdestructuring 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") 
} 

来自:实用科特林书