在Swift中使用isKindOfClass


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 ...

    }
}

Answers:


480

正确的Swift运算符是is

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

当然,如果您还需要将视图分配给新的常量,那么if let ... as? ...语法就是您的孩子,就像Kevin提到的那样。但是,如果您不需要该值而只需要检查类型,则应使用is运算符。


2
同样适用于Swift 3!
footyapps16年

同样适用于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拥有它不会有伤害。
瑞·佩雷斯2014年

4
通过将他们的答案放入您的答案中来窃取其他用户的代表的品味很差。
devios1 2016年

不起作用。建议UIPickerView.self。这是正确的吗?
Vyachaslav Gerchicov

49

您可以将检查合并到一个语句中:

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

然后,您可以pickerif块内使用。


3
这是“更正确”的答案,因为它使用了Swift的“ as?”。操作员。该文档指出:“在Objective-C中,您使用isKindOfClass:方法检查对象是否属于某种类类型,而conformsToProtocol:方法检查对象是否符合指定的协议。在Swift中,您可以完成此操作通过使用is运算符检查类型,或使用as?运算符向下转换为该类型来完成任务。” 苹果文档
亚当福克斯

这是迅速执行isKingOfClass的正确方法。仅当对象属于UIPickerView类时,才输入if块!好答案!
Florian Burel 2014年

只是想指出,如果您只需要进行检查,而不在随后的“ if”块中使用“ picker”,那么您将要使用:if _ = touch.view as?UIPickerView {...}
亚当·弗里曼

@AdamFreeman在这种情况下,您最好使用if touch.view is UIPickerView {...}
Kevin

在该语言首次发布后的几天,我不确定这个问题是否存在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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.