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

jtb*_*des 36 swift

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

if foo is MyClass {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

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

if something.isKindOfClass(MyClass) {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

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

Cal*_*leb 51

是的,有区别:is适用于Swift中的任何类,而isKindOfClass()只适用于那些作为子类NSObject或以其他方式实现的类NSObjectProtocol.


new*_*cct 15

一些差异:

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


Nat*_*dus 8

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

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

迅速

if object is UIButton {
    // object is of type UIButton
} else {
    // object is not of type UIButton
}
Run Code Online (Sandbox Code Playgroud)

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