Swift “与”之间有区别吗;是";这是属于阶级的吗?

Swift “与”之间有区别吗;是";这是属于阶级的吗?,swift,Swift,Swift提供is关键字(和as?)以检查对象是否可以成功向下投射: if foo is MyClass { // ... } 但是NSObjectProtocol还提供了原始的func-iskindof类(aClass:AnyClass!)->Bool: if something.isKindOfClass(MyClass) { // ... } 对于符合NSObjectProtocol的类,这真的有很大不同吗?是的有一个区别:是适用于Swift中的任何类,而是类()仅适用

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

if foo is MyClass {
    // ...
}
但是
NSObjectProtocol
还提供了原始的
func-iskindof类(aClass:AnyClass!)->Bool

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

对于符合
NSObjectProtocol
的类,这真的有很大不同吗?

是的有一个区别:
适用于Swift中的任何类,而
是类()
仅适用于属于
NSObject
的子类的类,或者实现
NSObjectProtocol

的类。有些差异:

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

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

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

迅捷的


我认为主要区别在于
as?
/
适用于不符合
NSObjectProtocol
的对象/结构。我认为OP真正询问的是
is
而不是
as?
Doh——这个问题最初指定为
as?
,但似乎已经编辑过了。我会修正我的答案。很抱歉突然编辑-我意识到
is
as?
:)更接近
iskindof class
)别担心--我(无意中)几乎偷了@BryanChen的评论,以便在我的答案中使用。对不起,布莱恩!为了公平起见,我将标记此社区Wiki。“而isKindOfClass()仅适用于作为NSObject子类或以其他方式实现NSObjectProtocol的类。”如果您将其转换为
AnyObject
(类似于AnyObject的内容)。isKindOfClass(MyClass)
if object is UIButton {
    // object is of type UIButton
} else {
    // object is not of type UIButton
}