来自AnyObject的Downcast?

时间:2014-11-10 15:22:01

标签: swift downcast

我对下面的代码发生了什么感到有些困惑。我认为children基于node.children(类型为[AnyObject])属于[SKNode]类型的children是可选的,我看到的是{{1}永远不会nil,这是因为[AnyObject]不包含任何类型信息?即使我将[SKNode]更改为[NSString],它仍会转到(1)?

    if let children = node.children as? [SKNode] {
        // (1) STUFF WITH SKNODE...
    } else {
        // (2) NOPE, ITS NOT AN SKNODE

1 个答案:

答案 0 :(得分:3)

node.children不是可选的。它总是返回一个类型为[AnyObject]的数组。如果没有子节点,则此数组将具有0个元素。如果有子项,则此数组将包含SKNode s。

可选绑定if let children = node.children as? [SKNode]将始终成功,因为可以将空数组[AnyObject]强制转换为[SKNode]

当我第一次看到node.children正在返回[AnyObject]而不是[SKNode]时,我认为这很奇怪。然后我意识到这是一个与Cocoa Touch一起使用的Objective-C接口,因此它无法返回[SKNode],即使它是它所包含的内容。