Swift型铸造/向下铸造

时间:2018-02-11 03:16:58

标签: swift optional downcast unwrap

为什么Xcode创建的Sprite Kit游戏模板项目使用as!

if let sceneNode = scene.rootNode as! GameScene? {...}

以下不一样好吗?

if let sceneNode = scene.rootNode as? GameScene {...}

请注意,这不是标准“as?as!”问题之间的差异。 Downcasting optionals in Swift: as? Type, or as! Type?非常接近,但也不是完全相同的。问题是上述两种模式似乎在功能上相似(它们都是向下倾斜和展开),但不清楚为什么作者使用if let ... as! GameScene? { ... }而不是更常见且更自然的if let ... as? GameScene { ... }

2 个答案:

答案 0 :(得分:1)

我说这是一个错误。无论如何,模式if let x = y as! Type?是不必要的,你不应该模仿它。模式if let x = y as? Type是等效且通常的。

答案 1 :(得分:1)

这两种模式非常接近,但在技术上并不相同:

  • if let ... as! GameScene? {...}强制转换为GameScene?if let然后安全地展开生成的可选项。

  • if let ... as? GameScene { ... }将优雅地向下翻转并打开结果。

从功能上讲,这两者几乎相同。问题是为什么模板将使用以前的语法。有人可能会争辩说as?模式有点含糊不清,因为看了一下代码,你无法判断你是仅仅测试了一个向下倾斜的成功,还是你正在处理一个可选的。模板的代码使其更加明确。

所有这些都被说过,我会使用if let ... as? GameScene { ... }模式。这是惯例。