Использование 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!
Рави

Как вы можете сделать это в операторе switch, чтобы проверить несколько различных типов классов?
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)
    {

    }
}

редактировать

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

Редактировать 2

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


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

@MalcolmJarvis это не больно иметь его.
Руи Перес

4
Воровать репутацию других пользователей, помещая их ответы в свой, - дурной вкус.
devios1

не работает Предлагает UIPickerView.self. Это правильно?
Вячеслав Герчиков,

49

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

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
Адам Фокс

Это правильный способ выполнения isKingOfClass в быстрой. Вы войдете в блок 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 и вкладывать все это в одно условие.

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.