Menggunakan isKindOfClass dengan Swift

231

Saya mencoba mengambil sedikit bahasa Swift dan saya bertanya-tanya bagaimana cara mengubah Objective-C berikut menjadi Swift:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    [super touchesBegan:touches withEvent:event];

    UITouch *touch = [touches anyObject];

    if ([touch.view isKindOfClass: UIPickerView.class]) {
      //your touch was in a uipickerview ... do whatever you have to do
    }
}

Lebih khusus lagi saya perlu tahu cara menggunakan isKindOfClasssintaks baru.

override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {

    ???

    if ??? {
        // your touch was in a uipickerview ...

    }
}
lkemitchll
sumber

Jawaban:

480

Operator Swift yang tepat adalah is:

if touch.view is UIPickerView {
    // touch.view is of type UIPickerView
}

Tentu saja, jika Anda juga perlu menetapkan tampilan ke konstanta baru, maka if let ... as? ...sintaksnya adalah anak laki-laki Anda, seperti yang disebutkan Kevin. Tetapi jika Anda tidak membutuhkan nilainya dan hanya perlu memeriksa jenisnya, maka Anda harus menggunakan isoperator.

KPM
sumber
2
Bekerja dengan Swift 3 juga!
footyapps27
Bekerja dengan Swift 4.2 juga!
Ravi
bagaimana Anda bisa melakukan ini dalam pernyataan switch untuk memeriksa beberapa jenis kelas yang berbeda?
BigBoy1337
132
override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {

    super.touchesBegan(touches, withEvent: event)
    let touch : UITouch = touches.anyObject() as UITouch

    if touch.view.isKindOfClass(UIPickerView)
    {

    }
}

Edit

Seperti yang ditunjukkan dalam jawaban @ Kevin , cara yang benar adalah dengan menggunakan operator cor tipe opsional as?. Anda dapat membaca lebih lanjut tentang itu di bagian Optional Chainingsub bagian Downcasting.

Edit 2

Seperti yang ditunjukkan pada jawaban lain oleh pengguna @KPM , menggunakan isoperator adalah cara yang tepat untuk melakukannya.

Rui Peres
sumber
Lupa super milikku. Anda juga dapat mengambil yang : UITouchini, karena tipe inferensi akan tahu apa itu oleh para as UITouchpemeran
Malcolm Jarvis
@MalcolmJarvis tidak ada ruginya memilikinya.
Rui Peres
4
Mencuri perwakilan pengguna lain dengan memberikan jawaban mereka pada Anda tidak enak.
devios1
tidak bekerja Menyarankan UIPickerView.self. Apakah itu benar?
Vyachaslav Gerchicov
49

Anda dapat menggabungkan cek dan melemparkan ke dalam satu pernyataan:

let touch = object.anyObject() as UITouch
if let picker = touch.view as? UIPickerView {
    ...
}

Kemudian Anda bisa menggunakannya pickerdi dalam ifblok.

Kevin
sumber
3
Ini adalah jawaban "lebih benar" karena menggunakan Swift 'as?' operator. Dokumentasi menyatakan bahwa "Dalam Objective-C, Anda menggunakan metode isKindOfClass: untuk memeriksa apakah suatu objek adalah tipe kelas tertentu, dan metode conformsToProtocol: untuk memeriksa apakah suatu objek sesuai dengan protokol yang ditentukan. Di Swift, Anda menyelesaikan ini tugas dengan menggunakan operator is untuk memeriksa suatu tipe, atau operator as? untuk downcast ke tipe itu. " Dokumentasi Apple
Adam Fox
Ini adalah cara yang tepat dalam melakukan isKingOfClass dengan cepat. Anda akan memasukkan blok if hanya jika objeknya adalah kelas UIPickerView! Jawaban bagus!
Florian Burel
Hanya ingin menunjukkan bahwa jika Anda hanya perlu melakukan pemeriksaan dan tidak menggunakan 'pemilih' di blok 'jika' berikutnya, maka Anda ingin menggunakan: jika biarkan _ = touch.view as? UIPickerView {...}
Adam Freeman
@AdamFreeman dalam hal ini Anda akan lebih baik menggunakanif touch.view is UIPickerView {...}
Kevin
Dan saya tidak yakin isatau _ada pada saat pertanyaan ini diajukan, beberapa hari setelah bahasa tersebut pertama kali diumumkan.
Kevin
1

Saya akan menggunakan:

override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {

    super.touchesBegan(touches, withEvent: event)
    let touch : UITouch = touches.anyObject() as UITouch

    if let touchView = touch.view as? UIPickerView
    {

    }
}
crazyname
sumber
-3

Pendekatan lain menggunakan sintaks Swift 2 baru adalah dengan menggunakan pelindung dan membuat sarang semuanya dalam satu kondisi.

guard let touch = object.AnyObject() as? UITouch, let picker = touch.view as? UIPickerView else {
    return //Do Nothing
}
//Do something with picker
Sam Corder
sumber