让我们分解原始代码行:
if let n = self.spinnyNode?.copy() as! SKShapeNode? { ...code... }
self.spinnyNode被声明为SKShapeNode?. 换句话说,它是一个可选的SKShapeNode.
SKShapeNode继承自NSObject提供copy方法。该copy方法被声明为 return Any。
self.spinnyNode?.copy()将返回Any?值为nilif self.spinnyNodeis的值,nil否则将返回非 nil Any?。
所以编译器认为这self.spinnyNode?.copy()将返回一个Any?. 但我们知道它真的会返回一个SKShapeNode?. 既然我们知道它到底是什么,我们就可以安全地使用as!. 既然我们知道它会返回一个SKShapeNode?,我们使用as! SKShapeNode?.
在这一点上,我们可以:
let n = self.spinnyNode?.copy() as! SKShapeNode?
n将在哪里SKShapeNode?。
由于我们现在想要安全地打开结果,我们if在 : 前面添加let:
if let n = self.spinnyNode?.copy() as! SKShapeNode? { ...code... }
在块内,我们知道这n是一个非 nil SKShapeNode。
综上所述,让我们回答您的问题:
- 这很危险吗?不,在这种情况下不是,因为我们确定这
self.spinnyNode?.copy()将始终导致SKShapeNode?我们可以安全地使用as!它来将其转换为SKShapeNode?.
- 为什么不使用更常见的
as? SKShapeNode模式?我们可以,但是当您不确定结果实际上是一个SKShapeNode.