Использование isKindOfClass с Swift

209

Я пытаюсь подобрать немного 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 ...

    }
}
Теги:
swift-converter

6 ответов

435
Лучший ответ

Правильный оператор Swift равен is:

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

Конечно, если вам также нужно назначить представление новой константе, синтаксис if let ... as? ... - ваш мальчик, как сказал Кевин. Но если вам не нужно значение и нужно только проверить тип, тогда вы должны использовать оператор is.

  • 2
    Да, это работает. Красиво и чисто.
  • 3
    правильный ответ (у)
Показать ещё 5 комментариев
124
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

Как указано в @Kevin answer, правильным способом было бы использовать необязательный оператор литья as?. Подробнее об этом можно узнать в разделе Optional Chaining подкатегория Downcasting.

Изменить 2

Как указано на другом ответе пользователя @KPM, использование оператора is - это правильный способ сделать это.

  • 0
    Забыл супер по моему. Вы также можете убрать : UITouch в этом, так как вывод типа будет знать, что это такое, as UITouch
  • 0
    @MalcolmJarvis это не больно иметь его.
Показать ещё 2 комментария
46

Вы можете комбинировать проверку и вставить в один оператор:

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

Затем вы можете использовать picker в блоке if.

  • 3
    Это «более правильный» ответ, потому что он использует Swift «как?» оператор. В документации говорится, что «В Objective-C вы используете isKindOfClass: метод, чтобы проверить, принадлежит ли объект определенному типу класса, и conformsToProtocol: метод, чтобы проверить, соответствует ли объект указанному протоколу. В Swift вы выполняете это задача с помощью оператора is для проверки типа или оператора as? для перехода к этому типу. " Документация Apple
  • 0
    Это правильный способ выполнения isKingOfClass в быстрой. Вы войдете в блок if, только если объект имеет класс UIPickerView! Отличный ответ!
Показать ещё 5 комментариев
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
    {

    }
}
0

Используйте это, если хотите изменить код с Objc на swift. Это очень полезно.

-2

Другой подход, использующий новый синтаксис Swift 2, заключается в том, чтобы использовать охрану и вложить все это в одно условное выражение.

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню