在您在Xcode中制作新游戏项目时创建的Apple代码的小样本中,GameScene有几个功能,它们使用了我没有遇到的展开模式,&我没有看到它的重点 -
if let n = self.spinnyNode?.copy() as! SKShapeNode? { ...code... }
两个问题 - (1)这是危险的,& (2)为什么不使用更常见的模式 -
if let n = self.spinnyNode?.copy() as? SKShapeNode { ...code... }
我在SO或Google上找不到与此有关的内容......
答案 0 :(得分:2)
让我们分解原始的代码行:
<telerik:RadComboBox
ItemsSource="{Binding}"
SelectedItem="{Binding finish}"/>
if let n = self.spinnyNode?.copy() as! SKShapeNode? { ...code... }
被声明为self.spinnyNode
。换句话说,它是可选的SKShapeNode?
。SKShapeNode
继承自提供SKShapeNode
方法的NSObject
。声明copy
方法返回copy
。Any
为self.spinnyNode?.copy()
,则Any?
将返回nil
,其值为self.spinnyNode
,否则将返回非零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
。
尽管如此,让我们回答你的问题:
SKShapeNode
始终会产生self.spinnyNode?.copy()
我们可以安全地使用SKShapeNode?
将其投放到as!
。SKShapeNode?
模式?我们可以,但是当您不确定结果实际上是as? SKShapeNode
时,会使用该模式。