“is”和“isKindOfClass()”之间有什么区别吗?

45

Swift提供了is关键字(以及as?)来检查一个对象是否可以被成功向下转型:

if foo is MyClass {
    // ...
}

但是 NSObjectProtocol 也提供了原始的 func isKindOfClass(aClass: AnyClass!) -> Bool

if something.isKindOfClass(MyClass) {
    // ...
}

对于符合NSObjectProtocol的类,这真的有很大的区别吗?


我认为主要的区别在于as?/is适用于未符合NSObjectProtocol的对象/结构体。 - Bryan Chen
3个回答

62

是的,它们有区别:is 可以用于 Swift 中的任何类,而isKindOfClass() 只能用于那些是 NSObject 子类或实现了 NSObjectProtocol 协议的类。


我认为OP真正关心的是is而不是as? - Bryan Chen
抱歉 - 问题最初指定为 as?,但似乎已被编辑。我会修复我的答案。 - Caleb
抱歉突然修改 - 我意识到 is 更接近于 isKindOfClass 而不是 as? :) - jtbandes
没关系 - 我无意中几乎抄袭了@BryanChen的评论来回答问题。对不起,Bryan!我会将这个回答标记为社区维基,以公平起见。 - Caleb
而isKindOfClass()仅适用于那些是NSObject的子类或以其他方式实现NSObjectProtocol的类。如果将其转换为AnyObject,它也适用于本地Swift类:(something as AnyObject).isKindOfClass(MyClass) - newacct

20

一些不同之处:

  • is 可以用于非类类型。 isKindOfClass: 仅可用于对象,以检查它们是否是类的实例。
  • 正如其他人已经提到的,isKindOfClass:NSObjectProtocol 上声明,因此除了 AnyObject 以外,它不会让你在未知该协议的表达式上使用它。实际上,本地 Swift 类也(非官方地)符合 NSObjectProtocol,因此如果将它们强制转换为 AnyObject,则仍然可以使用 isKindOfClass(something as AnyObject).isKindOfClass(MyClass)
  • is 也适用于协议检查,而在 NSObjectProtocol 方法方面,相当于它的等效方法是 conformsToProtocol:
  • is 接受必须在编译时硬编码的类型。 isKindOfClass: 接受一个表达式,其值可以在运行时计算。我不知道是否有一种只使用 Swift 标准库就可以在运行时检查对象是否是类(包括子类)的实例的方法。

9

在Objective-C中,使用isKindOfClass:方法检查一个对象是否属于某个类别,使用conformsToProtocol:方法检查对象是否符合指定的协议。在Swift中,您可以通过使用is运算符检查类型,或使用as?运算符下转换到该类型来完成此任务。

您可以使用is运算符检查实例是否属于某个子类类型。如果实例属于该子类类型,则is运算符返回true,否则返回false

SWIFT

if object is UIButton {
    // object is of type UIButton
} else {
    // object is not of type UIButton
}

https://developer.apple.com/library/ios/documentation/Swift/Conceptual/BuildingCocoaApps/AdoptingCocoaDesignPatterns.html


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接