Zwróć wiele wartości z funkcji w języku swift


148

Jak zwrócić 3 oddzielne wartości danych tego samego typu (Int) z funkcji w języku Swift?

Próbuję zwrócić godzinę, muszę zwrócić Godzinę, Minutę i Sekundę jako oddzielne liczby całkowite, ale wszystko za jednym razem z tej samej funkcji, czy to możliwe?

Myślę, że po prostu nie rozumiem składni zwracania wielu wartości. To jest kod, którego używam, mam problem z ostatnią (zwrotną) linią.

Każda pomoc byłaby bardzo mile widziana!

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 (obiekty: godzina, minuta, sekunda)
Amro Shafie,

4
„Swift Programming Language” iBook faktycznie zawiera sekcję zatytułowaną „Funkcje z wieloma zwracanymi wartościami” ...
Martin R

Odpowiedzi:


311

Zwróć krotkę:

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

Następnie jest wywoływany jako:

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

lub:

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

25
Zauważ, że lepszym rozwiązaniem może być zdefiniowanie struktury Time i użycie jej zamiast krotki.
David Berry,

1
Jak nazwałbyś tę szybką funkcję z obiektywnej metody C? Ciekawe, jak uzyskałbyś uchwyt do trzech zwróconych wartości. Czy użyłbyś na przykład słownika?
phil

1
Nie zrobiłbyś tego. Jeśli chcesz wywołać to z objc, musisz zwrócić klasę (może strukturę), której nie jesteś pewien.
David Berry,

5
Zaleca się dodanie nazwy do parametrów: func getTime () -> (godzina: Int, minuta: Int, sekunda: Int) Potem getTime (). Godzina
Bruno Lemos

@BrunoLemos eh, nadal mam zamiar pójść z lepszym rozwiązaniem, aby zdefiniować strukturę Time i użyć jej.
David Berry,

75

Również:

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

Następnie jest wywoływany jako:

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

To jest standardowy sposób używania go w książce The Swift Programming Language napisanej przez Apple.

lub tak jak:

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

jest tak samo, ale mniej wyraźnie.


1
the right answer can't compile right in swift 2.0: źle, zwracanie nienazwanej krotki w Swift 2 działa tak samo jak w Swift 1. Zobacz ten zrzut ekranu .
Eric Aya

tak, masz rację, ale w kontekście podobieństwa pojawia się błąd kompilacji. Powinienem znaleźć to, dlaczego.
jtianling

Błąd kompilacji nie był związany z tym, że format CalendarUnit zmienił się w Swift 2, a nie format krotki.
Eric Aya

Nie w ten sposób, błąd kompilacji, o którym mówiłem, pojawił się sam w kodzie.
jtianling

time.hournie będzie już działać. Zaktualizuj kod.
Lal Krishna

12

powinieneś zwrócić trzy różne wartości z tej metody i uzyskać te trzy w jednej zmiennej, takiej jak ta.

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

uzyskać wartość w jednej zmiennej

let getTime = getTime()

teraz możesz uzyskać dostęp do godziny, minut i sekund po prostu przez „”. to znaczy.

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

7

Szybki 3

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

Używać :

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

6

Aktualizacja Swift 4.1

Tutaj tworzymy strukturę do zaimplementowania użycia Tuple i sprawdzenia poprawności długości tekstu OTP. W tym przykładzie muszą to być 2 pola.

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

Stosowanie:

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

Mam nadzieję, że to pomoże!

Dzięki



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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.