在 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... }
self.spinnyNode
声明为 SKShapeNode?
。换句话说,它是一个可选的 SKShapeNode
.
SKShapeNode
继承自NSObject
,后者提供了copy
方法。 copy
方法声明为 return Any
.
self.spinnyNode?.copy()
将 return 一个值为 nil
的 Any?
如果 self.spinnyNode
是 nil
或它将 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
.
综上所述,让我们来回答您的问题:
- 这很危险吗?不,在这种情况下不是,因为我们确定
self.spinnyNode?.copy()
将始终导致 SKShapeNode?
我们可以安全地使用 as!
将其转换为 SKShapeNode?
.
- 为什么不使用更常见的
as? SKShapeNode
模式?我们可以,但是当您不确定结果实际上是 SKShapeNode
. 时,会使用该模式
在 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... }
self.spinnyNode
声明为SKShapeNode?
。换句话说,它是一个可选的SKShapeNode
.SKShapeNode
继承自NSObject
,后者提供了copy
方法。copy
方法声明为 returnAny
.self.spinnyNode?.copy()
将 return 一个值为nil
的Any?
如果self.spinnyNode
是nil
或它将 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
.
综上所述,让我们来回答您的问题:
- 这很危险吗?不,在这种情况下不是,因为我们确定
self.spinnyNode?.copy()
将始终导致SKShapeNode?
我们可以安全地使用as!
将其转换为SKShapeNode?
. - 为什么不使用更常见的
as? SKShapeNode
模式?我们可以,但是当您不确定结果实际上是SKShapeNode
. 时,会使用该模式