在Apple的游戏代码项目模板中展开选项

时间:2016-10-31 15:48:43

标签: swift optional forced-unwrapping

在您在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上找不到与此有关的内容......

1 个答案:

答案 0 :(得分:2)

让我们分解原始的代码行:

<telerik:RadComboBox 
    ItemsSource="{Binding}" 
    SelectedItem="{Binding finish}"/>
  1. if let n = self.spinnyNode?.copy() as! SKShapeNode? { ...code... } 被声明为self.spinnyNode。换句话说,它是可选的SKShapeNode?
  2. SKShapeNode继承自提供SKShapeNode方法的NSObject。声明copy方法返回copy
  3. 如果Anyself.spinnyNode?.copy(),则
  4. Any?将返回nil,其值为self.spinnyNode,否则将返回非零nil如果不是。
  5. 因此编译器认为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

    尽管如此,让我们回答你的问题:

    1. 这有危险吗?不,不是在这种情况下,因为我们确信SKShapeNode始终会产生self.spinnyNode?.copy()我们可以安全地使用SKShapeNode?将其投放到as!
    2. 为什么不使用更常见的SKShapeNode?模式?我们可以,但是当您不确定结果实际上是as? SKShapeNode时,会使用该模式。