Types 在swift中检测对象是否正是特定类型,而不是该类型的子类
在swift中,您可以使用类似以下内容检查对象是否属于特定类型Types 在swift中检测对象是否正是特定类型,而不是该类型的子类,types,swift,conditional-statements,Types,Swift,Conditional Statements,在swift中,您可以使用类似以下内容检查对象是否属于特定类型 let object: AnyObject = someOtherObject if object is SKNode { //is SKNode } 在这种情况下,SKShapeNode和SKSpriteNode也会满足这个条件,因为它们是SKNode的子类 检测对象是否属于特定类型而不是该类型的子类的标准方法是什么?这不是操作符的工作方式。如果这样做,您将得到一个编译错误 is运算符用于检查特定类型的对象是否属于给定的子
let object: AnyObject = someOtherObject
if object is SKNode {
//is SKNode
}
在这种情况下,SKShapeNode和SKSpriteNode也会满足这个条件,因为它们是SKNode的子类
检测对象是否属于特定类型而不是该类型的子类的标准方法是什么?这不是
操作符的工作方式。如果这样做,您将得到一个编译错误
is
运算符用于检查特定类型的对象是否属于给定的子类型。使用SKNode
和SKShapeNode
作为示例,您可以使用is
来验证键入为SKNode
的对象是SKShapeNode
还是SKSpriteNode
将其粘贴到操场,了解其工作原理:
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
}
你可以回到目标C:
if (object as AnyObject).isMemberOfClass(SKNode) {
//is SKNode
}
在Swift 2.2中,苹果批准的方法是:
if object.dynamicType === SKNode.self {
// is node
}
一旦实施(Swift 3.0),将更改为:
if object.Self === SKNode.self {
// is node
}
在swift 3中:
if type(of: object) == SKNode.self {
// is node
}
如果变量类型为anyobject,则测试并不总是正确的。我的示例非常具体。如果你把上面的代码粘贴到一个操场上,你会得到上面描述的确切结果。谢谢你的回复,塞扎,我并不是想贬低你所说的事实。在我的例子中,对象的类型是AnyObject而不是SKNode,因此我不存在这样的编译错误。我已经更新了问题以规定对象变量的类型。感谢Ashly,这确实适用于我的场景,并且是swift代码,即使返回到objective-c方法。请注意,这甚至适用于本机swift类(只要导入了基础
)