让我们分解原始代码行:
if let n = self.spinnyNode?.copy() as! SKShapeNode? { ...code... }
self.spinnyNode
被声明为SKShapeNode?
. 换句话说,它是一个可选的SKShapeNode
.
SKShapeNode
继承自NSObject
提供copy
方法。该copy
方法被声明为 return Any
。
self.spinnyNode?.copy()
将返回Any?
值为nil
if self.spinnyNode
is的值,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
.