【问题标题】:Return multiple values from a function in swift快速从函数中返回多个值
【发布时间】:2015-02-16 07:58:22
【问题描述】:

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

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

我想我只是不明白返回多个值的语法。这是我正在使用的代码,我遇到了最后(返回)行的问题。

任何帮助将不胜感激!

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
}

【问题讨论】:

  • 返回 NSArray(对象:时、分、秒)
  • “Swift 编程语言”iBook 实际上有一个标题为“具有多个返回值的函数”...

标签: function swift return


【解决方案1】:

返回一个元组:

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

然后它被调用为:

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

或:

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

【讨论】:

  • 请注意,更好的解决方案可能是定义一个 Time 结构并使用它而不是元组。
  • 你会如何从一个客观的 C 方法调用那个 swift func?好奇如何获得三个返回值的句柄。例如,您会使用字典吗?
  • 你不会的。如果你想从 objc 调用它,你必须返回一个不确定的类(可能是一个结构)。
  • 建议在参数中加上name:func getTime() -> (hour: Int, minute: Int,second: Int) 然后getTime().hour
  • @BrunoLemos 嗯,我仍然会采用更好的解决方案,即定义一个 Time 结构并使用它。
【解决方案2】:

还有:

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

相同,但不太清楚。

【讨论】:

  • the right answer can't compile right in swift 2.0: 错误,在 Swift 2 中返回一个未命名的元组的工作方式与 Swift 1 相同。请参阅此screenshot
  • 是的,你是对的,但我在相似性上下文中遇到编译错误。我应该找到原因。
  • 与编译错误无关,这是因为 Swift 2 中 CalendarUnit 格式发生了变化,不是元组格式。
  • 不是这样的,我说的编译错误是我自己在代码中出现的。
  • time.hour 将不再起作用。请更新代码。
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

    斯威夫特 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)
    

    【讨论】:

      【解决方案5】:

      更新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)
          }
      

      希望对你有帮助!

      谢谢

      【讨论】:

      【解决方案6】:
      //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
      猜你喜欢
      • 2021-04-30
      • 1970-01-01
      • 1970-01-01
      • 2022-11-19
      • 1970-01-01
      • 1970-01-01
      • 2018-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多