Swift提供了is
关键字(以及as?
)来检查一个对象是否可以被成功向下转型:
if foo is MyClass {
// ...
}
但是 NSObjectProtocol
也提供了原始的 func isKindOfClass(aClass: AnyClass!) -> Bool
:
if something.isKindOfClass(MyClass) {
// ...
}
对于符合NSObjectProtocol
的类,这真的有很大的区别吗?
Swift提供了is
关键字(以及as?
)来检查一个对象是否可以被成功向下转型:
if foo is MyClass {
// ...
}
但是 NSObjectProtocol
也提供了原始的 func isKindOfClass(aClass: AnyClass!) -> Bool
:
if something.isKindOfClass(MyClass) {
// ...
}
对于符合NSObjectProtocol
的类,这真的有很大的区别吗?
是的,它们有区别:is
可以用于 Swift 中的任何类,而isKindOfClass()
只能用于那些是 NSObject
子类或实现了 NSObjectProtocol
协议的类。
is
而不是as?
。 - Bryan Chenas?
,但似乎已被编辑。我会修复我的答案。 - Calebis
更接近于 isKindOfClass
而不是 as?
:) - jtbandesAnyObject
,它也适用于本地Swift类:(something as AnyObject).isKindOfClass(MyClass)
。 - newacct一些不同之处:
is
可以用于非类类型。 isKindOfClass:
仅可用于对象,以检查它们是否是类的实例。isKindOfClass:
在 NSObjectProtocol
上声明,因此除了 AnyObject
以外,它不会让你在未知该协议的表达式上使用它。实际上,本地 Swift 类也(非官方地)符合 NSObjectProtocol
,因此如果将它们强制转换为 AnyObject
,则仍然可以使用 isKindOfClass
:(something as AnyObject).isKindOfClass(MyClass)
is
也适用于协议检查,而在 NSObjectProtocol
方法方面,相当于它的等效方法是 conformsToProtocol:
is
接受必须在编译时硬编码的类型。 isKindOfClass:
接受一个表达式,其值可以在运行时计算。我不知道是否有一种只使用 Swift 标准库就可以在运行时检查对象是否是类(包括子类)的实例的方法。在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
}
as?
/is
适用于未符合NSObjectProtocol
的对象/结构体。 - Bryan Chen