当前位置: 首页 > 知识库问答 >
问题:

如何像在Swift中一样从静态编程语言中的函数返回多个值?

袁鸿达
2023-03-14

如何从Kotlin中的一个函数返回3个独立的相同类型的数据值(< code>Int)?

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

在swift中,我们像跟随一样做,

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

我们能在科特林实现这个目标吗?

P、 S:我知道我可以使用数组或Hashmap,但我想知道Kotlin中是否存在类似Swift的东西。

共有3个答案

袁和通
2023-03-14

虽然通常,一个函数只能返回一个值,但在静态编程语言中,通过利用Pair类型和析构声明的优势,我们可以从一个函数返回两个变量。考虑以下示例:

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

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

来自: 功能性 Kotlin 书籍

陈霄
2023-03-14

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

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

附言:解构时您可以使用比值更少的变量,例如var(a, b)=getTime(),但您不能使用更多,否则您将获得ArrayIndexOutOfBoundsException

洪和平
2023-03-14

在Kotlin中不能创建任意的元组,相反,可以使用数据类。一种选择是使用内置的< code>Pair和< code>Triple类,它们是泛型的,可以分别保存两个或三个值。您可以将这些与析构声明结合使用,如下所示:

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

val (num, str) = getPair()

您还可以对ListArray进行分解,最多可用于前5个元素:

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()
 类似资料:
  • 用Python我可以写: 如何用静态编程语言编写?

  • 我想为我的游戏创建一个简单的倒计时,当游戏开始时,我想每秒调用这个函数: 我试过这个: 但应用程序不幸停止,第二次调用run函数 3周前,我刚刚开始使用android开发和静态编程语言,到目前为止,我对它了解最多。 在Xcode中使用swift时,我使用了这一行,我认为类似的东西也适用于Kotlin

  • 我知道内联函数可能会提高性能 编译器可以发出以下代码,而不是为参数创建函数对象并生成调用。(来源) 但是我发现没有kotlin为一个非内联函数创建的函数对象。为什么?

  • 我正在学习静态编程语言,我在函数方面有一些问题。我试图创建一个带有通用参数的函数接口。Java我会创建这样的东西: 然后我可以在其他地方像这样使用它(给定扩展: 你是怎么和Kotlin写这篇文章的? 我尝试的第一件事是使用如下类型别名: 但是,当我将绑定添加到type参数时,它停止了工作: 第二种方法是编写一个扩展函数类型的接口: 然而,现在我不知道如何用这个来实例化lambda函数。当我从中创建

  • 我希望函数位于类中(不污染全局名称空间),但可以静态访问(从不创建它们所在的对象)。提议的解决办法: 这是一个好的解决方案,还是不可避免地会创建一个对象?我应该使用哪种图案?

  • 问题内容: 选项:使用元组 考虑下面这个简单的例子: 但是,随着返回值的数量增加,这很快就会成为问题。如果要返回四个或五个值怎么办?当然,你可以继续修改它们,但是很容易忘记哪个值在哪里。在任何想要接收它们的地方打开它们的包装也是很丑陋的。 选项:使用字典 下一步的逻辑步骤似乎是引入某种“记录符号”。在Python中,一种明显的方法是使用dict。 考虑以下: (请注意,y0,y1和y2只是抽象标识