Restituisce più valori da una funzione in rapido


148

Come posso restituire 3 valori di dati separati dello stesso tipo (Int) da una funzione in rapido?

Sto tentando di restituire l'ora del giorno, devo restituire l'ora, i minuti e i secondi come numeri interi separati, ma tutto in uno passa dalla stessa funzione, è possibile?

Penso di non capire la sintassi per restituire più valori. Questo è il codice che sto usando, ho problemi con l'ultima riga (di ritorno).

Qualsiasi aiuto sarebbe molto apprezzato!

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 (oggetti: ora, minuti, secondi)
Amro Shafie,

4
L'iBook "Swift Programming Language" in realtà ha una sezione intitolata "Funzioni con valori di ritorno multipli" ...
Martin R

Risposte:


312

Restituisci una tupla:

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

Quindi viene invocato come:

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

o:

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

25
Nota che una soluzione migliore potrebbe essere quella di definire una struttura temporale e usarla al posto della tupla.
David Berry,

1
Come chiameresti quella rapida funzione da un metodo C obiettivo? Curioso come guadagneresti tre valori restituiti. Utilizzeresti un dizionario, per esempio?
phil

1
Non lo faresti. Se vuoi chiamarlo da objc devi restituire una classe (forse una struct) non sicuro.
David Berry,

5
Si consiglia di aggiungere un nome ai parametri: func getTime () -> (ora: Int, minuto: Int, secondo: Int) Quindi prendi come getTime (). Ora
Bruno Lemos

@BrunoLemos eh, sto ancora andando con la soluzione migliore è quella di definire una struttura temporale e usarla.
David Berry,

75

Anche:

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

Quindi viene invocato come:

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

Questo è il modo standard di usarlo nel libro The Swift Programming Language scritto da Apple.

o semplicemente come:

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

è lo stesso ma meno chiaramente.


1
the right answer can't compile right in swift 2.0: sbagliato, restituendo una tupla senza nome in Swift 2 funziona come con Swift 1. Guarda questo screenshot .
Eric Aya,

sì, hai ragione, ma ho un errore di compilazione in un contesto di somiglianza. Dovrei trovarlo perché.
jtianling,

L'errore di compilazione non era correlato, era perché il formato CalendarUnit era cambiato in Swift 2, non il formato tupla.
Eric Aya,

Non così, l'errore di compilazione di cui ho parlato è apparso nel codice da solo.
jtianling,

time.hournon funzionerà più. Si prega di aggiornare il codice.
Lal Krishna,

12

dovresti restituire tre valori diversi da questo metodo e ottenere questi tre in una singola variabile come questa.

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

ottenere il valore in singola variabile

let getTime = getTime()

ora puoi accedere a ora, minuti e secondi semplicemente con "." vale a dire.

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

Usare :

let(hour, min,sec) = self.getTime()
print(hour,min,sec)

6

Aggiorna Swift 4.1

Qui creiamo una struttura per implementare l'utilizzo di Tuple e convalidare la lunghezza del testo OTP. Questo esempio deve contenere 2 campi.

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

Spero che sia d'aiuto!

Grazie



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

Uscita: la differenza di tempo tra India e Canada è 27,0
Dhaval Nimavat,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.