“是”和isKindOfClass()之间有区别吗?

时间:2014-07-22 01:48:25

标签: swift

Swift提供is关键字(和as?)来检查对象是否可以成功向下转换:

if foo is MyClass {
    // ...
}

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

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

对于符合NSObjectProtocol的类,这真的很不一样吗?

3 个答案:

答案 0 :(得分:50)

存在差异:is适用于Swift中的任何类,而isKindOfClass()仅适用于NSObject的子类或其他类实施NSObjectProtocol

答案 1 :(得分:15)

一些差异:

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

答案 2 :(得分:8)

在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