为什么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 { ... }
。
答案 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 { ... }
模式。这是惯例。