【问题标题】:Unwrapping optionals in Apple's game code project template在 Apple 的游戏代码项目模板中展开选项
【发布时间】:2016-10-31 15:48:42
【问题描述】:

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

【问题讨论】:

  • @Anish웃 没有回答这个问题:OP 提供的两个例子都是向下转换的。他在询问它们之间的差异,而 Apple 示例中的代码采用了它所做的方法。
  • 这不是答案..只是一个他可以参考的链接
  • 是的 - 我想我知道向下转换... :)

标签: swift optional forced-unwrapping


【解决方案1】:

让我们分解原始代码行:

if let n = self.spinnyNode?.copy() as! SKShapeNode? { ...code... }
  1. self.spinnyNode 被声明为 SKShapeNode?。换句话说,它是一个可选的SKShapeNode
  2. SKShapeNode 继承自 NSObject,后者提供了 copy 方法。 copy 方法被声明为返回 Any
  3. 如果self.spinnyNodenilself.spinnyNode?.copy() 将返回值为nilAny?,否则将返回非零Any?

所以编译器认为self.spinnyNode?.copy() 将返回一个Any?。但我们知道它真的会返回一个SKShapeNode?。因为我们知道它的真正含义,所以我们可以安全地使用as!。因为我们知道它会返回一个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 时,会使用该模式。

【讨论】:

  • 谢谢 - 这很好地清除了它,尽管我确实怀疑我自己是否会使用这种模式
猜你喜欢
  • 1970-01-01
  • 2014-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-12
  • 1970-01-01
相关资源
最近更新 更多