Geben Sie schnell mehrere Werte von einer Funktion zurück

148

Wie gebe ich 3 separate Datenwerte des gleichen Typs (Int) von einer Funktion in Swift zurück?

Ich versuche, die Tageszeit zurückzugeben. Ich muss Stunde, Minute und Sekunde als separate Ganzzahlen zurückgeben, aber alles auf einmal von derselben Funktion aus. Ist dies möglich?

Ich glaube, ich verstehe die Syntax für die Rückgabe mehrerer Werte einfach nicht. Dies ist der Code, den ich verwende. Ich habe Probleme mit der letzten (Rückgabe-) Zeile.

Jede Hilfe wäre sehr dankbar!

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
quelle
1
Rückkehr NSArray (Objekte: Stunde, Minute, Sekunde)
Amro Shafie
4
Das iBook "Swift Programming Language" hat tatsächlich einen Abschnitt mit dem Titel "Funktionen mit mehreren Rückgabewerten" ...
Martin R

Antworten:

310

Geben Sie ein Tupel zurück:

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

Dann wird es aufgerufen als:

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

oder:

let time = getTime()
println("hour: \(time.0)")
David Berry
quelle
25
Beachten Sie, dass eine bessere Lösung darin bestehen könnte, eine Zeitstruktur zu definieren und diese anstelle des Tupels zu verwenden.
David Berry
1
Wie würden Sie diese schnelle Funktion von einer objektiven C-Methode nennen? Neugierig, wie Sie drei zurückgegebene Werte in den Griff bekommen würden. Würden Sie zum Beispiel ein Wörterbuch verwenden?
Phil
1
Das würdest du nicht. Wenn Sie es von objc aus aufrufen möchten, müssen Sie eine Klasse (möglicherweise eine Struktur) zurückgeben, die nicht sicher ist.
David Berry
5
Es wird empfohlen, den Parametern einen Namen hinzuzufügen: func getTime () -> (Stunde: Int, Minute: Int, Sekunde: Int) Dann wie getTime (). Stunde
Bruno Lemos
@BrunoLemos eh, ich werde immer noch mit der besseren Lösung gehen, eine Zeitstruktur zu definieren und diese zu verwenden.
David Berry
74

Ebenfalls:

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

Dann wird es aufgerufen als:

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

Dies ist die Standardmethode für die Verwendung in dem von Apple verfassten Buch The Swift Programming Language.

oder einfach wie:

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

es ist das gleiche, aber weniger klar.

jtianling
quelle
1
the right answer can't compile right in swift 2.0: falsch, die Rückgabe eines unbenannten Tupels in Swift 2 funktioniert genauso wie in Swift 1. Siehe diesen Screenshot .
Eric Aya
Ja, Sie haben Recht, aber ich erhalte einen Kompilierungsfehler in einem Ähnlichkeitskontext. Ich sollte es finden warum.
Jtianling
Der Kompilierungsfehler war nicht verwandt, da sich das CalendarUnit-Format in Swift 2 geändert hat und nicht das Tupelformat.
Eric Aya
Nicht so, der Kompilierungsfehler, über den ich gesprochen habe, erschien selbst im Code.
Jtianling
time.hourwird nicht mehr funktionieren. Bitte aktualisieren Sie den Code.
Lal Krishna
12

Sie sollten drei verschiedene Werte von dieser Methode zurückgeben und diese drei in einer einzigen Variablen wie dieser erhalten.

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

Holen Sie sich den Wert in einer einzelnen Variablen

let getTime = getTime()

Jetzt können Sie auf die Stunden, Minuten und Sekunden einfach mit "." zugreifen. dh.

print("hour:\(getTime.hour) min:\(getTime.min) sec:\(getTime.sec)")
Nabu
quelle
7

Swift 3

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

Benutzen :

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

Aktualisieren Sie Swift 4.1

Hier erstellen wir eine Struktur, um die Tupelverwendung zu implementieren und die OTP-Textlänge zu validieren. Das muss für dieses Beispiel aus 2 Feldern bestehen.

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

Verwendung:

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

Ich hoffe es hilft!

Vielen Dank

Harjot Singh
quelle
1
Zum besseren Verständnis: 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
quelle
Ausgabe: Wetterunterschied zwischen Indien und Kanada ist 27.0
Dhaval Nimavat