Swift ile isKindOfClass kullanma


231

Swift dilini biraz almaya çalışıyorum ve aşağıdaki Objective-C'yi Swift'e nasıl dönüştüreceğimizi merak ediyorum:

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

Daha spesifik isKindOfClassolarak yeni sözdiziminde nasıl kullanılacağını bilmem gerekiyor .

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

    ???

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

    }
}

Yanıtlar:


480

Uygun Swift operatörü is:

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

Tabii ki, görünümü yeni bir sabite de atamanız gerekiyorsa, if let ... as? ...sözdizimi Kevin'in belirttiği gibi çocuğunuzdur. Ancak değere ihtiyacınız yoksa ve yalnızca türü kontrol etmeniz gerekiyorsa, isişleci kullanmalısınız .


2
Swift 3 ile de çalışıyor!
— 16:16

Swift 4.2 ile de çalışıyor!
— Ravi

bunu birkaç farklı sınıf tipini kontrol etmek için bir switch deyiminde nasıl yapabilirsiniz?
— 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)
    {

    }
}

Düzenle

İşaret edildiği gibi Kevin'in cevap @ , doğru yolu opsiyonel tip döküm operatörü kullanmak olacaktır as?. Bununla ilgili daha fazla bilgiyi bölüm Optional Chainingalt bölümünde bulabilirsiniz Downcasting.

Düzenle 2

@KPM kullanıcısının diğer cevabına işaret ettiği gibi , isoperatörün kullanılması bunu yapmanın doğru yoludur.


Benimkini unuttum. Bunu da : UITouchçıkarabilirsiniz, çünkü tür çıkarımı as UITouchoyuncu tarafından ne olduğunu bilecektir
— Malcolm Jarvis

@MalcolmJarvis sahip olmak acıtmaz.
— Rui Peres

4
Cevabını sizinkine koyarak diğer kullanıcıların temsilcilerini çalmak kötü bir tada sahiptir.
— devios1

çalışmıyor. Önerir UIPickerView.self. Doğru mu?
— Vyachaslav Gerchicov

49

Çeki birleştirebilir ve tek bir ifadeye atabilirsiniz:

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

Sonra blok pickeriçinde kullanabilirsiniz if.


3
Bu "daha doğru" cevaptır çünkü Swift'i 'olarak kullanıyor mu?' Şebeke. Belgeler, "Objective-C içinde, bir nesnenin belirli bir sınıf türünde olup olmadığını kontrol etmek için isKindOfClass: yöntemini ve bir nesnenin belirli bir protokole uygun olup olmadığını kontrol etmek için conformsToProtocol: yöntemini kullandığınızı belirtir. Swift'te bunu başarırsınız. görevi bir türü denetlemek için is operatörünü veya bu türe downcast etmek için as? operatörünü kullanarak. " Apple Belgeleri
— Adam Fox

İsKingOfClass'ı hızlı bir şekilde gerçekleştirmenin doğru yolu budur. İf bloğunu yalnızca nesne UIPickerView sınıfındaysa girersiniz. Mükemmel cevap!
— Florian Burel

Sadece kontrol yapmanız ve sonraki 'if' bloğunda 'seçici' kullanmamanız gerektiğinde şunu kullanmak istersiniz: o zaman şunu kullanmak istersiniz: if let _ = touch.view as? UIPickerView {...}
— Adam Freeman

Bu durumda @AdamFreeman kullanarak daha iyi olurduif touch.view is UIPickerView {...}
— Kevin

Ve bu sorunun sorduğu noktada, dilin ilk açıklanmasından birkaç gün sonra ne olduğundan ya isda _var olduğundan emin değilim .
— Kevin

1

Kullanmak istiyorum:

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
    {

    }
}

-3

Yeni Swift 2 sözdizimini kullanan başka bir yaklaşım, korumayı kullanmak ve hepsini tek bir koşulda yerleştirmektir.

guard let touch = object.AnyObject() as? UITouch, let picker = touch.view as? UIPickerView else {
    return //Do Nothing
}
//Do something with picker
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.