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
}

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

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.


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

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)

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



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

Ausgabe: Wetterunterschied zwischen Indien und Kanada ist 27.0
Dhaval Nimavat
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.