【问题标题】:Detect if an object is exactly a specific type and not a subclass of that type in swift快速检测对象是否完全是特定类型而不是该类型的子类
【发布时间】:2014-08-22 01:59:32
【问题描述】:

在 swift 中,您可以使用类似于以下内容的方式检查对象是否属于特定类型

let object: AnyObject = someOtherObject
if object is SKNode {
   //is SKNode
}

在这种情况下,SKShapeNode 和 SKSpriteNode 也将满足此条件,因为它们是 SKNode 的子类。

检测对象是否属于特定类型而不是该类型的子类的标准方法是什么?

【问题讨论】:

    标签: types swift conditional-statements


    【解决方案1】:

    你可以回退到 Objective-C:

    if (object as AnyObject).isMemberOfClass(SKNode) {
       //is SKNode
    }
    

    【讨论】:

    • 感谢 Ashely,这确实适用于我的场景并且是 swift 代码,即使退回到 Objective-c 方法。
    • 请注意,这甚至适用于原生 Swift 类(只要导入了 Foundation
    【解决方案2】:

    Apple 认可的在 Swift 2.2 中执行此操作的方法是:

    if object.dynamicType === SKNode.self {
       // is node
    }
    

    一旦实现this proposal (Swift 3.0),它将变为:

    if object.Self === SKNode.self {
       // is node
    }
    

    【讨论】:

      【解决方案3】:

      这不是is 运算符的工作方式。如果你这样做,你会得到一个编译错误。

      is 运算符用于检查特定类型的对象是否属于给定的子类型。以SKNodeSKShapeNode 为例,您可以使用is 来验证类型为SKNode 的对象是SKShapeNode 还是SKSpriteNode

      将其粘贴到 Playground 以了解其工作原理:

      let shape: SKNode = SKShapeNode()
      let sprite: SKNode = SKSpriteNode()
      let anotherShape = SKShapeNode()
      
      if shape is SKShapeNode {
          println("is shape")
      }
      
      if sprite is SKSpriteNode {
          println("is sprite")
      }
      
      if shape is SKNode {
          //this raises a compile error, because the test is always true
      }
      
      if anotherShape is SKNode {
          //this raises a compile error, because SKNode is not a subtype of SKShapeNode
      }
      

      【讨论】:

      • 如果变量是 AnyObject 类型,则测试并不总是正确
      • 我的例子非常具体。如果您将上面的代码粘贴到 Playground 中,您将得到上面描述的确切结果。
      • 感谢 Cezar 的回复,我并没有试图贬低你所说的事实。在我的情况下,对象的类型是 AnyObject 而不是 SKNode,所以对我来说不存在这样的编译错误。
      • 我已更新问题以规定对象变量的类型。
      【解决方案4】:

      在 Swift 3 中:

      if type(of: object) == SKNode.self {
         // is node
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-09-23
        • 1970-01-01
        • 2018-07-10
        • 2011-02-14
        • 1970-01-01
        • 2020-12-21
        • 2012-10-09
        • 2016-11-24
        相关资源
        最近更新 更多