Devuelve múltiples valores de una función en swift

148

¿Cómo devuelvo 3 valores de datos separados del mismo tipo (Int) de una función en swift?

Estoy intentando devolver la hora del día, necesito devolver la hora, el minuto y el segundo como números enteros separados, pero todo de una vez desde la misma función, ¿es esto posible?

Creo que simplemente no entiendo la sintaxis para devolver múltiples valores. Este es el código que estoy usando, tengo problemas con la última línea (retorno).

Cualquier ayuda sería muy apreciada!

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
}
OllieGreen
fuente
1
return NSArray (objetos: hora, minuto, segundo)
Amro Shafie
44
El iBook "Swift Programming Language" tiene una sección titulada "Funciones con múltiples valores de retorno" ...
Martin R

Respuestas:

312

Devuelve una tupla:

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

Luego se invoca como:

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

o:

let time = getTime()
println("hour: \(time.0)")
David Berry
fuente
25
Tenga en cuenta que una mejor solución podría ser definir una estructura de tiempo y usarla en lugar de la tupla.
David Berry
1
¿Cómo llamarías a esa función rápida desde un método objetivo C? Curioso de cómo podría manejar tres valores devueltos. ¿Usarías un diccionario, por ejemplo?
Phil
1
No lo harías Si desea llamarlo desde objc, debe devolver una clase (tal vez una estructura) no está seguro.
David Berry
55
Se recomienda agregar un nombre a los parámetros: func getTime () -> (hora: Int, minuto: Int, segundo: Int) Luego obtener como getTime (). Hora
Bruno Lemos
@BrunoLemos eh, todavía voy a ir con la mejor solución es definir una estructura de tiempo y usarla.
David Berry
75

También:

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

Luego se invoca como:

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

Esta es la forma estándar de cómo usarlo en el libro The Swift Programming Language escrito por Apple.

o simplemente como:

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

Es lo mismo pero menos claro.

jtianling
fuente
1
the right answer can't compile right in swift 2.0: mal, devolver una tupla sin nombre en Swift 2 funciona igual que con Swift 1. Ver esta captura de pantalla .
Eric Aya
Sí, tienes razón, pero recibo un error de compilación en un contexto de similitud. Debería encontrar por qué.
jtianling
El error de compilación no estaba relacionado, se debía a que el formato CalendarUnit había cambiado en Swift 2, no al formato de tupla.
Eric Aya
No así, el error de compilación del que hablé apareció en el código yo mismo.
jtianling
time.hourya no funcionará Por favor actualice el código.
Lal Krishna el
12

debe devolver tres valores diferentes de este método y obtener estos tres en una sola variable como esta.

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

obtener el valor en una sola variable

let getTime = getTime()

ahora puede acceder a la hora, minutos y segundos simplemente con "." es decir.

print("hour:\(getTime.hour) min:\(getTime.min) sec:\(getTime.sec)")
nabu
fuente
7

Swift 3

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

Usar :

let(hour, min,sec) = self.getTime()
print(hour,min,sec)
Hardik Thakkar
fuente
6

Actualizar Swift 4.1

Aquí creamos una estructura para implementar el uso de Tuple y validar la longitud del texto OTP. Eso debe ser de 2 campos para este ejemplo.

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

Uso:

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

¡Espero eso ayude!

Gracias

Harjot Singh
fuente
1
Para una mejor comprensión: 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)")
Dhaval Nimavat
fuente
Salida: La diferencia climática entre India y Canadá es 27.0
Dhaval Nimavat