【问题标题】:What's the difference between (as! SKView?) and (as? SKView)(as!SKView?)和(as?SKView)有什么区别
【发布时间】:2016-12-16 08:49:16
【问题描述】:

我刚刚构建了一个 SpriteKit 演示应用程序。 我不在下面的代码下

if let view = self.view as! SKView? {
        ...
    }

(self.view as!SKView?) 是什么意思? 他们为什么不直接写这样的代码:

if let view = self.view as? SKView {
        ...
    }

有什么区别? 非常感谢!

【问题讨论】:

  • 第一个语法(强制展开一个可选的可选)在术语上是矛盾的,根本不应该使用。我希望编译器在用于可选绑定时抛出错误。
  • @Eric 你的问题得到解答了吗?
  • 我在 Xcode 8.2 创建的 SpriteKit 默认演示中获得了这些代码。我认为开发人员使用 (as!) 是因为他想表达 (self.view) 已经设置为一个 SKView 实例并且永远不会为 nil。同时他想使用 (if let) 语法,所以他需要一个可选类型(SKView?)。也许这只是一种习惯,根本没有必要。

标签: swift


【解决方案1】:

案例一

self.view 被强制转换为SKView?(又名Optional<SKView>)。如果此转换失败(当self.view 实际上不是SKView?),则程序将崩溃以防止进入不一致状态。

如果不是nil,则生成的SKView? 然后被安全地解包并分配给view,否则将执行else 的情况,如果有的话。

案例 2

self.view 被安全地转换为 SKView。这个表达式的结果是SKView。它将有一个有效值(如果可以进行转换),或者如果不能进行转换,则为nil。与第一种情况不同,它不会崩溃。

如果不是nil,则生成的SKView? 然后被安全地解包并分配给view,否则将执行else 的情况,如果有的话。

【讨论】:

  • 谢谢,亚历山大。虽然我还不太明白演示中代码的含义。也许它只是一种语法,不需要太多关注。
  • @Eric 我的意思是,我给出的解释正是针对特定的示例。也许尝试问我后续问题,我会尝试解决困惑。这不仅仅是语法,这两个选项在语义上是不同的。了解其中的区别绝对很重要
【解决方案2】:
if let view = self.view as? SKView { ... }

这意味着如果视图可以转换为SKView,那么就做,否则就不做。这是安全的,因为它不会使程序崩溃,建议使用。这就是问号的意思。可以投成SKView吗?

if let view = self.view as! SKView? { ... }

这真的不应该被使用。您是说应该强制将视图强制转换为可选的 SKView,如果 SKView 可以展开,该视图将起作用。正如另一位用户所说,它是重复的,即使不会给您错误也不应该使用。

【讨论】:

    猜你喜欢
    • 2017-02-26
    • 2010-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-16
    • 2022-07-29
    • 2015-12-26
    • 1970-01-01
    相关资源
    最近更新 更多