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.