快速检测对象是不是完全是特定类型而不是该类型的子类

Posted

技术标签:

【中文标题】快速检测对象是不是完全是特定类型而不是该类型的子类【英文标题】: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 的子类。

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

【问题讨论】:

【参考方案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

【讨论】:

以上是关于快速检测对象是不是完全是特定类型而不是该类型的子类的主要内容,如果未能解决你的问题,请参考以下文章

快速覆盖 UIView 中的默认图层类型

java中的String类型的对象为啥可以自动转换成Object类型的?而Object却要强制转换成String类型的

Sprite kit:删除特定节点而不是所有节点

打字稿为“对象”分配特定类型而不是“任何”

如何获取 NSItemProvider 提供的实际数据/内容而不是类型

管理中显示的对象类型而不是 def __unicode__ 中的特定值