3

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

4

1 回答 1

2

让我们分解原始代码行:

if let n = self.spinnyNode?.copy() as! SKShapeNode? { ...code... }
  1. self.spinnyNode被声明为SKShapeNode?. 换句话说,它是一个可选的SKShapeNode.
  2. SKShapeNode继承自NSObject提供copy方法。该copy方法被声明为 return Any
  3. 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

综上所述,让我们回答您的问题:

  1. 这很危险吗?不,在这种情况下不是,因为我们确定这self.spinnyNode?.copy()将始终导致SKShapeNode?我们可以安全地使用as!它来将其转换为SKShapeNode?.
  2. 为什么不使用更常见的as? SKShapeNode模式?我们可以,但是当您不确定结果实际上是一个SKShapeNode.
于 2016-10-31T16:54:07.370 回答