快速从函数返回多个值


148

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

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

我想我只是不了解返回多个值的语法。这是我正在使用的代码,我在last(return)行上遇到了麻烦。

任何帮助将不胜感激!

func getTime() -> Int
{
    let date = NSDate()
    let calendar = NSCalendar.currentCalendar()
    let components = calendar.components(.CalendarUnitHour | .CalendarUnitMinute | .CalendarUnitSecond, fromDate: date)
    let hour = components.hour
    let minute = components.minute
    let second = components.second
    let times:String = ("\(hour):\(minute):\(second)")
    return hour, minute, second
}

1
返回NSArray(对象:时,分,秒)
Amro Shafie 2014年

4
“快速编程语言” iBook实际上有一个标题为“具有多个返回值的函数”的部分……
Martin R

Answers:


311

返回一个元组:

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

然后将其调用为:

let (hour, minute, second) = getTime()

要么:

let time = getTime()
println("hour: \(time.0)")

25
注意,更好的解决方案可能是定义一个Time结构并使用它代替元组。
David Berry

1
您如何从目标C方法中调用该快速函子?很好奇如何获得三个返回值的句柄。例如,您会使用字典吗?
菲尔2014年

1
你不会的 如果要从objc调用它,则必须返回不确定的类(也许是结构)。
大卫·贝里

5
我们推荐添加名称参数:函数的getTime() - >(小时:诠释,分:诠释,第二:智力)然后得到这样的getTime()小时。
布鲁诺莱莫斯

@BrunoLemos嗯,我仍然要使用更好的解决方案,即定义一个Time结构并使用它。
David Berry 2015年

75

也:

func getTime() -> (hour: Int, minute: Int,second: Int) {
    let hour = 1
    let minute = 2
    let second = 3
    return ( hour, minute, second)
}

然后将其调用为:

let time = getTime()
print("hour: \(time.hour), minute: \(time.minute), second: \(time.second)")

这是在Apple编写的《 The Swift Programming Language》一书中使用它的标准方法。

或就像:

let time = getTime()
print("hour: \(time.0), minute: \(time.1), second: \(time.2)")

一样,但不清楚。


1
the right answer can't compile right in swift 2.0:错误,在Swift 2中返回未命名的元组的工作方式与在Swift 1中相同。请参见此屏幕截图
Eric Aya 2015年

是的,您是对的,但是在相似性上下文中出现编译错误。我应该找到原因。
jtianling

编译错误无关,这是因为CalendarUnit格式已在Swift 2中更改,而不是元组格式。
埃里克·艾雅2015年

并不是那样,我谈论的编译错误是自己出现在代码中。
jtianling

time.hour将不再工作。请更新代码。
拉里·克里希纳

12

您应该从此方法返回三个不同的值,并在一个这样的变量中获得这三个值。

func getTime()-> (hour:Int,min:Int,sec:Int){
//your code
return (hour,min,sec)
}

获取单个变量中的值

let getTime = getTime()

现在,您可以通过“。”简单地访问小时,分钟和秒。即。

print("hour:\(getTime.hour) min:\(getTime.min) sec:\(getTime.sec)")

7

迅捷3

func getTime() -> (hour: Int, minute: Int,second: Int) {
        let hour = 1
        let minute = 20
        let second = 55
        return (hour, minute, second)
    }

使用方法:

let(hour, min,sec) = self.getTime()
print(hour,min,sec)

6

更新Swift 4.1

在这里,我们创建一个结构来实现元组用法并验证OTP文本长度。在此示例中,该字段必须为2个字段。

struct ValidateOTP {
var code: String
var isValid: Bool }

func validateTheOTP() -> ValidateOTP {
    let otpCode = String(format: "%@%@", txtOtpField1.text!, txtOtpField2.text!)
    if otpCode.length < 2 {
        return ValidateOTP(code: otpCode, isValid: false)
    } else {
        return ValidateOTP(code: otpCode, isValid: true)
    }
}

用法:

let isValidOTP = validateTheOTP()
    if isValidOTP.isValid { print(" valid OTP") } else {   self.alert(msg: "Please fill the valid OTP", buttons: ["Ok"], handler: nil)
    }

希望能帮助到你!

谢谢



1
//By : Dhaval Nimavat
    import UIKit

   func weather_diff(country1:String,temp1:Double,country2:String,temp2:Double)->(c1:String,c2:String,diff:Double)
   {
    let c1 = country1
    let c2 = country2
    let diff = temp1 - temp2
    return(c1,c2,diff)
   }

   let result = 
   weather_diff(country1: "India", temp1: 45.5, country2: "Canada", temp2:    18.5)
   print("Weather difference between \(result.c1) and \(result.c2) is \(result.diff)")

输出:印度和加拿大之间的天气差是27.0
Dhaval Nimavat 18'July
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.