为什么Xcode创建的Sprite Kit Game模板工程使用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!游戏场景? { ... }
而不是更常见、更自然的 if let ... as?游戏场景 { ... }
.
最佳答案
这两种模式非常接近,但技术上并不相同:
if let ... as!游戏场景? {...}
是否强制转换为GameScene?
,然后if let
安全地解开生成的可选值。if let ... as? GameScene { ... }
将优雅地向下转换并展开结果。
从功能上来说,这两者几乎是等效的。问题是为什么模板会使用以前的语法。有人可能会说 as?
模式不太含糊,因为看一眼代码,您无法判断您是否只是在测试向下转型是否成功,或者是否也在处理可选。模板的代码使这一点更加明确。
话虽如此,我会使用 if let ... as? GameScene { ... }
模式。这是习惯。
关于Swift 类型类型转换/向下类型转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48727937/