Використання isKindOfClass з Swift


231

Я намагаюся забрати трохи Swift lang і мені цікаво, як перетворити наступний Objective-C в 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
    }
}

Більш конкретно, мені потрібно знати, як використовувати isKindOfClassв новому синтаксисі.

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

    ???

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

    }
}

Відповіді:


480

Правильним оператором Swift є is:

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

Звичайно, якщо вам також потрібно призначити погляд новій константі, то if let ... as? ...синтаксис - це ваш хлопчик, як згадував Кевін. Але якщо вам не потрібно значення і потрібно лише перевірити тип, тоді вам слід скористатися isоператором.


2
Працює і зі Swift 3!
footyapps27

Працює і зі Swift 4.2!
Раві

як ви можете це зробити в операторі перемикання, щоб перевірити кілька різних типів класів?
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)
    {

    }
}

Редагувати

Як вказувалося у відповіді @ Кевіна , правильним способом було б використання необов'язкового оператора литого типу as?. Детальніше про це можна прочитати в Optional Chainingпідрозділі розділу Downcasting.

Редагувати 2

Як було зазначено в іншій відповіді користувача @KPM , використання isоператора - це правильний спосіб зробити це.


Забув супер у моєму. Ви також можете вийняти : UITouchв цьому, оскільки висновок про тип знатиме, що це за as UITouchакторський склад
Малькольм Джарвіс

@MalcolmJarvis це не завадить мати його.
Rui Peres

4
Викрасти репліку інших користувачів, поклавши свою відповідь на вашу, поганий смак.
devios1

не працює. Пропонує UIPickerView.self. Це правильно?
Вячаслав Герчич

49

Ви можете об'єднати чек і представити один вислів:

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

Потім ви можете використовувати pickerвсередині ifблоку.


3
Це "правильніша" відповідь, оскільки вона використовує "Швидкий" як? " оператор. У документації зазначається, що "В Objective-C ви використовуєте метод isKindOfClass: для перевірки того, чи є об'єкт певного типу класу, а метод conversToProtocol: для перевірки відповідності об'єкта певному протоколу. У Swift ви досягаєте цього Завдання, використовуючи оператор для перевірки типу, або оператора as? для того, щоб перейти на цей тип. " Документація Apple
Адам Фокс

Це правильний спосіб виконання KingOfClass у швидкому режимі. Ви введете блок if, лише якщо об'єкт класу UIPickerView! Чудова відповідь!
Флоріан Бурель

Я просто хотів зазначити, що якщо вам просто потрібно зробити перевірку і не використовувати "picker" у наступному блоці "if", то ви хочете використовувати: if let _ = touch.view as? UIPickerView {...}
Адам Фріман

@AdamFreeman у такому випадку вам краще скористатисяif touch.view is UIPickerView {...}
Кевін

І я не впевнений, isчи _існував на даний момент питання, яке було задано через кілька днів після того, як мова була вперше оголошена.
Кевін

1

Я б використав:

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

Ще один підхід із використанням нового синтаксису Swift 2 - використовувати охорону та вкладати все це за один умовний.

guard let touch = object.AnyObject() as? UITouch, let picker = touch.view as? UIPickerView else {
    return //Do Nothing
}
//Do something with picker
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.