在 Apple 的游戏代码项目模板中解包选项

Unwrapping optionals in Apple's game code project template

在 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...

上找不到任何与此相关的内容

让我们分解一下原来的代码行:

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() 将 return 一个值为 nilAny? 如果 self.spinnyNodenil 或它将 return 非零 Any? 如果不是。

所以编译器认为 self.spinnyNode?.copy() 会 return 一个 Any?。但我们知道它真的会 return 一个 SKShapeNode?。因为我们知道它的真实情况,所以我们可以安全地使用 as!。因为我们知道它会 return 一个 SKShapeNode?,所以我们使用 as! SKShapeNode?.

此时我们可以:

let n = self.spinnyNode?.copy() as! SKShapeNode?

其中 n 将是 SKShapeNode?

因为我们现在想要安全地解包结果,我们在 let 前面添加 if:

if let n = self.spinnyNode?.copy() as! SKShapeNode? { ...code... }

在代码块内部我们知道 n 是一个非零的 SKShapeNode.

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

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