Swift 类型类型转换/向下类型转换

标签 swift option-type downcast unwrap

为什么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/

相关文章:

ios - MKMapItem 地标在 swift 中不可用

ios - 使用纹理为 Sprite 着色不起作用

ios - 通过任意操作快速进行可选链接?

swift - 隐式展开的可选值真的是可选值吗?

C++ QT 将 QList 中的项目转换为子类

java - 为什么我们真的需要向下转型?

ios - 通过 wifi 向 Apple Watch 发送远程通知

ios - 将按钮添加到键盘工具栏

java - 如何将 Optional<T> 转换为 Stream<T>?

error-handling - 当使用 catch_unwind 处理 panic 时,为什么不能将 Option.expect() 消息向下转换为 &'static str?