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.