【问题标题】:Is there a difference between "is" and isKindOfClass()?"is" 和 isKindOfClass() 之间有区别吗?
【发布时间】:2014-07-22 01:48:25
【问题描述】:

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

if foo is MyClass {
    // ...
}

但是NSObjectProtocol也提供了原来的func isKindOfClass(aClass: AnyClass!) -> Bool

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

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

【问题讨论】:

  • 我认为主要区别在于as?/is 适用于不符合NSObjectProtocol 的对象/结构。

标签: swift


【解决方案1】:

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

【讨论】:

  • 我认为 OP 真的在询问 is 而不是 as?
  • Doh -- 最初指定as? 的问题,但似乎已被编辑。我会修正我的答案。
  • 抱歉突然编辑——我意识到is 更接近isKindOfClass 而不是as? :)
  • 不用担心——我(不经意间)偷了@BryanChen 的评论用于我的回答。对不起,布莱恩!为了公平起见,我会标记这个社区 Wiki。
  • “而 isKindOfClass() 仅适用于那些是 NSObject 子类或以其他方式实现 NSObjectProtocol 的类。”它也适用于原生 Swift 类,如果你将其转换为 AnyObject: (something as AnyObject).isKindOfClass(MyClass)
【解决方案2】:

一些区别:

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

【讨论】:

    【解决方案3】:

    在 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
    }
    

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

    【讨论】:

      猜你喜欢
      • 2023-03-27
      • 1970-01-01
      • 2010-09-13
      • 2022-02-04
      • 1970-01-01
      • 2010-09-06
      • 1970-01-01
      相关资源
      最近更新 更多