Использование isKindOfClass с Swift
Я пытаюсь подобрать немного 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 ...
}
}
Ответы
Ответ 1
Правильный оператор Swift равен is
:
if touch.view is UIPickerView {
// touch.view is of type UIPickerView
}
Конечно, если вам также нужно назначить представление новой константе, синтаксис if let ... as? ...
- ваш мальчик, как сказал Кевин. Но если вам не нужно значение и нужно только проверить тип, тогда вы должны использовать оператор is
.
Ответ 2
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
- это правильный способ сделать это.
Ответ 3
Вы можете комбинировать проверку и вставить в один оператор:
let touch = object.anyObject() as UITouch
if let picker = touch.view as? UIPickerView {
...
}
Затем вы можете использовать picker
в блоке if
.
Ответ 4
Я бы использовал:
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
{
}
}
Ответ 5
Используйте это, если хотите изменить код с Objc на swift. Это очень полезно.
Ответ 6
Другой подход, использующий новый синтаксис Swift 2, заключается в том, чтобы использовать охрану и вложить все это в одно условное выражение.
guard let touch = object.AnyObject() as? UITouch, let picker = touch.view as? UIPickerView else {
return //Do Nothing
}
//Do something with picker