Renvoie plusieurs valeurs d'une fonction dans swift

148

Comment renvoyer 3 valeurs de données distinctes du même type (Int) à partir d'une fonction dans Swift?

J'essaie de renvoyer l'heure, je dois renvoyer les heures, les minutes et les secondes sous forme d'entiers séparés, mais tout en un à partir de la même fonction, est-ce possible?

Je pense que je ne comprends tout simplement pas la syntaxe pour renvoyer plusieurs valeurs. C'est le code que j'utilise, j'ai des problèmes avec la dernière ligne (de retour).

Toute aide serait grandement appréciée!

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
la source
1
retour NSArray (objets: heure, minute, seconde)
Amro Shafie
4
Le "langage de programmation Swift" iBook a en fait une section intitulée "Fonctions avec plusieurs valeurs de retour" ...
Martin R

Réponses:

312

Renvoie un tuple:

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

Ensuite, il est appelé comme suit:

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

ou:

let time = getTime()
println("hour: \(time.0)")
David Berry
la source
25
Notez qu'une meilleure solution pourrait être de définir une structure Time et de l'utiliser à la place du tuple.
David Berry
1
Comment appelleriez-vous cette fonction rapide à partir d'une méthode objective C? Curieux de savoir comment vous gagneriez une poignée à trois valeurs renvoyées. Utilisez-vous un dictionnaire, par exemple?
phil
1
Vous ne le feriez pas. Si vous voulez l'appeler depuis objc, vous devez renvoyer une classe (peut-être une structure) pas sûr.
David Berry
5
Il est recommandé d'ajouter un nom aux paramètres: func getTime () -> (hour: Int, minute: Int, second: Int) Puis obtenir comme getTime (). Hour
Bruno Lemos
@BrunoLemos eh, je vais toujours choisir la meilleure solution est de définir une structure Time et de l'utiliser.
David Berry
75

Aussi:

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

Ensuite, il est appelé comme suit:

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

C'est la manière standard de l'utiliser dans le livre The Swift Programming Language écrit par Apple.

ou juste comme:

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

c'est la même chose mais moins clairement.

jtianling
la source
1
the right answer can't compile right in swift 2.0: faux, renvoyer un tuple sans nom dans Swift 2 fonctionne de la même manière qu'avec Swift 1. Voir cette capture d'écran .
Eric Aya
oui, vous avez raison, mais j'obtiens une erreur de compilation dans un contexte de similitude. Je devrais trouver pourquoi.
jtianling
L'erreur de compilation n'était pas liée, c'était parce que le format CalendarUnit avait changé dans Swift 2, pas le format tuple.
Eric Aya
Pas comme ça, l'erreur de compilation dont j'ai parlé était moi-même apparue dans le code.
jtianling
time.hourne fonctionnera plus. Veuillez mettre à jour le code.
Lal Krishna
12

vous devez retourner trois valeurs différentes de cette méthode et obtenir ces trois dans une seule variable comme celle-ci.

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

obtenir la valeur en une seule variable

let getTime = getTime()

maintenant, vous pouvez accéder aux heures, minutes et secondes simplement par "." c'est à dire.

print("hour:\(getTime.hour) min:\(getTime.min) sec:\(getTime.sec)")
nabu
la source
7

Swift 3

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

Utiliser :

let(hour, min,sec) = self.getTime()
print(hour,min,sec)
Hardik Thakkar
la source
6

Mettre à jour Swift 4.1

Ici, nous créons une structure pour implémenter l'utilisation de Tuple et valider la longueur du texte OTP. Cela doit être de 2 champs pour cet exemple.

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

Usage:

let isValidOTP = validateTheOTP()
    if isValidOTP.isValid { print(" valid OTP") } else {   self.alert(msg: "Please fill the valid OTP", buttons: ["Ok"], handler: nil)
    }

J'espère que ça aide!

Merci

Harjot Singh
la source
1
Pour une meilleure compréhension: 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
la source
Sortie: La différence de temps entre l'Inde et le Canada est de 27,0
Dhaval Nimavat