2014-12-17 2 views
81

Come restituire 3 valori di dati separati dello stesso tipo (Int) da una funzione in rapido?Restituisce più valori da una funzione in swift

Sto tentando di restituire l'ora del giorno, ho bisogno di restituire l'ora, il minuto e il secondo come interi separati, ma tutto in uno va dalla stessa funzione, è possibile?

Penso di non capire la sintassi per la restituzione di più valori. Questo è il codice che sto usando, sto avendo 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

ritorno NSArray (oggetti: ore, minuti, secondi) –

+4

La "Swift Programming Language" iBook ha effettivamente una sezione intitolata "Funzioni con più valori di ritorno" ... –

risposta

169

ritorno una tupla:

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

Poi viene invocato come:

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

o:

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

Si noti che una soluzione migliore potrebbe essere quella di definire e una struttura temporale e usa quella al posto della tupla. –

+0

Fantastico, grazie mille! – OllieGreen

+0

Come chiameresti quella funzione rapida da un metodo obiettivo C? Curioso come otterresti un handle per tre valori restituiti. Utilizzeresti un dizionario, ad esempio? – phil

49

anche:

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

Poi viene invocato come:

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

Questo è il modo standard come usarlo nel libro The Swift linguaggio di programmazione scritto da Apple.

o semplicemente piace:

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

è lo stesso, ma meno chiaramente.

+0

'la risposta giusta non può essere compilata direttamente in swift 2.0': errata, restituire una tupla senza nome in Swift 2 funziona come con Swift 1. Vedi questo [screenshot] (https://www.evernote.com/l/ AOzsWRB_wiZHIq_AlDExw9rKUjV9hJeFiHo). – Moritz

+0

sì, hai ragione, ma ottengo un errore di compilazione in un contesto di similarità. Dovrei trovarlo perché. – jtianling

+0

L'errore di compilazione non era correlato, era a causa del formato CalendarUnit modificato in Swift 2, * non * del formato tupla. – Moritz

7

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 è possibile accedere l'ora, minuti e secondi, semplicemente "" vale a dire.

print("hour:\(getTime.hour) min:\(getTime.min) sec:\(getTime.sec)") 
3

Swift 3

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

Per utilizzare:

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