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
}

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

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.


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

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)

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



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

Salida: La diferencia climática entre India y Canadá es 27.0
Dhaval Nimavat
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.