在Swift中从函数返回多个值

176

我该怎样使用Swift从一个函数中返回同一类型(Int)的3个不同数据值?

我要返回当前时间,需要将小时、分钟和秒分别作为整数一次性返回,但都是从同一个函数中返回的,这可能吗?

我想我只是不理解返回多个值的语法。这是我正在使用的代码,我在最后一个(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对象:小时,分钟,秒 - Amr Hossam
5
"Swift编程语言" iBook 实际上有一个名为“具有多个返回值的函数”部分... - Martin R
6个回答

370

返回一个元组:

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

然后它被调用为:

let (hour, minute, second) = getTime()
或:
let time = getTime()
println("hour: \(time.0)")

28
注意,一个更好的解决方案可能是定义一个时间结构体并使用它来代替元组。 - David Berry
1
你会如何从Objective-C方法中调用Swift函数?好奇你如何获取三个返回值的句柄。例如,你会使用字典吗? - phil
1
你不会这样做的。如果你想从 objc 中调用它,你必须返回一个类(可能是一个结构体),但我不确定。 - David Berry
7
建议在参数中添加名称: func getTime() -> (hour: Int, minute: Int, second: Int)然后可以像这样获取时间:getTime().hour - Bruno Lemos
@BrunoLemos 嗯,我仍然认为更好的解决方案是定义一个时间结构并使用它。 - David Berry
显示剩余4条评论

84

还有:

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

这是苹果公司编写的《Swift编程语言》中介绍的标准用法。

或者只需要这样:

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

它是相同的,但表达不够清晰。


1
正确答案在Swift 2.0中无法编译通过是错误的。在Swift 2中,返回未命名元组与Swift 1中相同。请参见此屏幕截图 - Eric Aya
是的,你说得对,但我在相似性上下文中遇到了编译错误。我应该找出原因。 - jtianling
编译错误与元组格式无关,而是因为在Swift 2中CalendarUnit格式已更改。 - Eric Aya
不是那个问题,我提到的编译错误出现在我的代码中。 - jtianling
time.hour不再起作用,请更新代码。 - Lal Krishna
我测试过了,还是没问题的。而且使用方法仍然在苹果公司的最新文档"具有多个返回值的函数"中。 - jtianling

15

你应该从这个方法返回三个不同的值,并像这样在单个变量中获取这三个值。

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

10

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

8

更新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
为了更好的理解:https://medium.com/@abhimuralidharan/tuple-in-swift-a9ddeb314c79 - Harjot Singh

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接