Swift提供is
关键字(和as?
)来检查对象是否可以成功向下转换:
if foo is MyClass {
// ...
}
但NSObjectProtocol
也提供原始func isKindOfClass(aClass: AnyClass!) -> Bool
:
if something.isKindOfClass(MyClass) {
// ...
}
对于符合NSObjectProtocol
的类,这真的很不一样吗?
答案 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
}