Hızlıca bir işlevden birden fazla değer döndürme


148

Hızlı bir işlevden aynı türden (Int) 3 ayrı veri değerini nasıl döndürürüm?

Günün saatini döndürmeye çalışıyorum, Saat, Dakika ve Saniyeyi ayrı tamsayılar olarak döndürmem gerekiyor, ama hepsi aynı işlevden bir arada, bu mümkün mü?

Ben sadece birden çok değer döndürme sözdizimi anlamıyorum düşünüyorum. Bu kullanıyorum kodu, son (dönüş) hattı ile sorun yaşıyorum.

Herhangi bir yardım büyük mutluluk duyacağız!

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
dönüş NSArray (nesneler: saat, dakika, saniye)
Amro Shafie

4
"Hızlı Programlama Dili" iBook aslında "Çoklu Dönüş
Martin R

Yanıtlar:


312

Bir demet döndür:

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

Sonra şu şekilde çağrılır:

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

veya:

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

25
Daha iyi bir çözümün Zaman yapısını tanımlamak ve demet yerine bunu kullanmak olabileceğini unutmayın.
David Berry

1
Bu hızlı fonu nesnel bir C yönteminden nasıl adlandırırsınız? Üç döndürülen değeri nasıl ele alacağınızı merak edin. Örneğin bir sözlük kullanır mısınız?
phil

1
Yapmazsın. Eğer objc'den çağırmak istiyorsanız emin değilsiniz bir sınıf (belki bir yapı) dönmek zorunda.
David Berry

5
Parametrelere ad eklemeniz önerilir: func getTime () -> (saat: Int, dakika: Int, saniye: Int) Sonra getTime () gibi olsun saat.
Bruno Lemos

@BrunoLemos ha, ben hala daha iyi bir çözüm ile gideceğim bir Time yapı tanımlamak ve kullanmaktır.
David Berry

75

Ayrıca:

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

Sonra şu şekilde çağrılır:

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

Apple tarafından yazılan Swift Programlama Dili kitabında kullanmanın standart yolu budur.

veya aynen şöyle:

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

aynı ama daha az net.


1
the right answer can't compile right in swift 2.0: yanlış, Swift 2'de adsız bir demet döndürmek Swift 1 ile aynı şekilde çalışır . Bu ekran görüntüsüne bakın .
Eric Aya

evet, haklısın, ama benzerlik bağlamında derleme hatası alıyorum. Nedenini bulmalıyım.
jtianling

Derleme hatası ilişkilendirilmedi, bunun nedeni , tuple biçiminde değil Swift 2'de CalendarUnit biçiminin değişmiş olmasıydı .
Eric Aya

Öyle değil, bahsettiğim derleme hatası kodda kendim görünüyordu.
jtianling

time.hourartık çalışmayacak. Lütfen kodu güncelleyin.
Lal Krishna

12

bu yöntemden üç farklı değer döndürmeli ve bu üçünü böyle tek bir değişkende almalısınız.

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

tek değişkenli değeri al

let getTime = getTime()

şimdi saate, dakikaya ve saniyeye sadece "." yani.

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

7

Hızlı 3

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

Kullanmak :

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

6

Swift 4.1'i Güncelle

Burada Tuple kullanımını uygulamak ve OTP metin uzunluğunu doğrulamak için bir yapı oluşturuyoruz. Bu örnek için bunun 2 alan olması gerekir.

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

Kullanımı:

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

Umarım yardımcı olur!

Teşekkürler



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

Çıktı: Hindistan ve Kanada arasındaki hava farkı 27.0
Dhaval Nimavat
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.