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
}
Ollie Hijau
sumber
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)")
David Berry
sumber
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.

jtianling
sumber
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)")
nabu
sumber
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)
Hardik Thakkar
sumber
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

Harjot Singh
sumber
1
Untuk pemahaman yang lebih baik: 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
sumber
Output: Perbedaan cuaca antara India dan Kanada adalah 27,0
Dhaval Nimavat