Kembalikan beberapa nilai dari fungsi dengan cepat


148

Bagaimana cara mengembalikan 3 nilai data yang terpisah dari jenis yang sama (Int) dari fungsi di cepat?

Saya mencoba mengembalikan waktu dalam sehari, saya perlu mengembalikan Jam, Menit, dan Kedua sebagai bilangan bulat terpisah, tetapi semuanya dalam satu fungsi yang sama, apakah ini mungkin?

Saya pikir saya tidak mengerti sintaksis untuk mengembalikan beberapa nilai. Ini adalah kode yang saya gunakan, saya mengalami masalah dengan baris (kembali) terakhir.

Bantuan apa pun akan sangat dihargai!

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
mengembalikan NSArray (objek: jam, menit, detik)
Amro Shafie

4
"Bahasa Pemrograman Swift" iBook sebenarnya memiliki bagian berjudul "Fungsi dengan Nilai-nilai Pengembalian Berganda" ...
Martin R

Jawaban:


312

Kembalikan tuple:

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

Kemudian dipanggil sebagai:

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

atau:

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

25
Perhatikan bahwa solusi yang lebih baik mungkin untuk mendefinisikan struct Waktu dan menggunakannya sebagai pengganti tuple.
David Berry

1
Bagaimana Anda memanggil fungsi cepat itu dari metode C objektif? Ingin tahu bagaimana Anda akan mendapatkan pegangan untuk tiga nilai yang dikembalikan. Apakah Anda menggunakan kamus, misalnya?
phil

1
Kamu tidak akan Jika Anda ingin memanggilnya dari objc Anda harus mengembalikan kelas (mungkin struct) tidak yakin.
David Berry

5
Disarankan untuk menambahkan nama ke parameter: func getTime () -> (jam: Int, menit: Int, kedua: Int) Kemudian dapatkan seperti getTime (). Hour
Bruno Lemos

@ BrunoLemos eh, saya masih akan pergi dengan solusi yang lebih baik adalah dengan mendefinisikan struct Waktu dan menggunakannya.
David Berry

75

Juga:

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

Kemudian dipanggil sebagai:

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

Ini adalah cara standar bagaimana menggunakannya dalam buku The Swift Programming Language yang ditulis oleh Apple.

atau seperti:

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

itu sama tetapi kurang jelas.


1
the right answer can't compile right in swift 2.0: salah, mengembalikan tupel tanpa nama di Swift 2 berfungsi sama dengan Swift 1. Lihat tangkapan layar ini .
Eric Aya

ya, Anda benar, tetapi saya mendapatkan kesalahan kompilasi dalam konteks kesamaan. Saya harus menemukannya mengapa.
jtianling

Kesalahan kompilasi tidak terkait, itu karena format CalendarUnit telah berubah di Swift 2, bukan format tuple.
Eric Aya

Tidak seperti itu, kesalahan kompilasi yang saya bicarakan muncul di kode sendiri.
jtianling

time.hourtidak akan bekerja lagi. Harap perbarui kode.
Lal Krishna

12

Anda harus mengembalikan tiga nilai berbeda dari metode ini dan mendapatkan ketiganya dalam satu variabel seperti ini.

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

dapatkan nilai dalam variabel tunggal

let getTime = getTime()

sekarang Anda dapat mengakses jam, menit, dan detik hanya dengan "." yaitu.

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

7

Cepat 3

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

Menggunakan :

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

6

Perbarui Swift 4.1

Di sini kami membuat struct untuk mengimplementasikan penggunaan Tuple dan memvalidasi panjang teks OTP. Itu harus dari 2 bidang untuk contoh ini.

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

Pemakaian:

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

Semoga ini bisa membantu!

Terima kasih



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

Output: Perbedaan cuaca antara India dan Kanada adalah 27,0
Dhaval Nimavat
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.