Retornar vários valores de uma função em swift

148

Como faço para retornar 3 valores de dados separados do mesmo tipo (Int) de uma função no swift?

Estou tentando retornar a hora do dia, preciso retornar a hora, o minuto e o segundo como números inteiros separados, mas todos de uma só vez partem da mesma função, isso é possível?

Eu acho que simplesmente não entendo a sintaxe para retornar vários valores. Este é o código que estou usando, estou tendo problemas com a última linha (de retorno).

Qualquer ajuda seria muito 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
fonte
1
retornar NSArray (objetos: hora, minuto, segundo)
Amro Shafie
4
O "Idioma Swift Programação" iBook realmente tem uma seção intitulada "Funções com vários valores de retorno" ...
Martin R

Respostas:

312

Retornar uma tupla:

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

Em seguida, é invocado como:

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

ou:

let time = getTime()
println("hour: \(time.0)")
David Berry
fonte
25
Observe que uma solução melhor pode ser definir uma estrutura de tempo e usá-la em vez da tupla.
David Berry
1
Como você chamaria essa função rápida de um método C objetivo? Curioso como você conseguiria lidar com três valores retornados. Você usaria um dicionário, por exemplo?
phil
1
Você não faria. Se você quiser chamá-lo de objc, você deve retornar uma classe (talvez uma estrutura) sem ter certeza.
David Berry
5
É recomendado para adicionar o nome dos parâmetros: func getTime () -> (hora: Int, minuto: Int, segundo: Int) Em seguida, obter como getTime () hora.
de Bruno Lemos
@BrunoLemos eh, ainda vou usar a melhor solução é definir uma estrutura de tempo e usá-la.
David Berry
75

Além disso:

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

Em seguida, é invocado como:

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

Esta é a maneira padrão de como usá-lo no livro The Swift Programming Language, escrito pela Apple.

ou apenas como:

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

é o mesmo, mas menos claramente.

jtianling
fonte
1
the right answer can't compile right in swift 2.0: errado, retornar uma tupla sem nome no Swift 2 funciona da mesma maneira que no Swift 1. Veja esta captura de tela .
Eric Aya
Sim, você está certo, mas recebo um erro de compilação em um contexto de similaridade. Eu deveria encontrar o porquê.
Jtianling
O erro de compilação não estava relacionado, era porque o formato CalendarUnit foi alterado no Swift 2, não no formato da tupla.
Eric Aya
Não é assim, o erro de compilação de que falei foi o mesmo que aparecer no código.
Jtianling
time.hournão vai mais funcionar. Atualize o código.
Lal Krishna
12

você deve retornar três valores diferentes desse método e obter esses três em uma única variável como esta.

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

obter o valor na variável única

let getTime = getTime()

agora você pode acessar a hora, min e segundos simplesmente "". ie

print("hour:\(getTime.hour) min:\(getTime.min) sec:\(getTime.sec)")
nabu
fonte
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
fonte
6

Atualização Swift 4.1

Aqui, criamos uma estrutura para implementar o uso da Tupla e validar o comprimento do texto OTP. Isso precisa ser de 2 campos para este exemplo.

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 que ajude!

obrigado

Harjot Singh
fonte
1
Para melhor entendimento: 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
fonte
Saída: A diferença climática entre Índia e Canadá é 27,0
Dhaval Nimavat 12/07/19