Swift 什么';(as!SKView?)和(as?SKView?)之间的区别是什么

Swift 什么';(as!SKView?)和(as?SKView?)之间的区别是什么,swift,Swift,我刚刚创建了一个SpriteKit演示应用程序。 我不知道下面的代码 if let view = self.view as! SKView? { ... } (self.view as!SKView?)是什么意思? 他们为什么不这样写代码呢: if let view = self.view as? SKView { ... } 有什么区别? 非常感谢!案例1 self.view强制转换为SKView?(又称可选)。如果此转换失败(当self.v

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

if let view = self.view as! SKView? {
        ...
    }
(self.view as!SKView?)是什么意思? 他们为什么不这样写代码呢:

if let view = self.view as? SKView {
        ...
    }
有什么区别? 非常感谢!

案例1
self.view
强制转换为
SKView?
(又称
可选)。如果此转换失败(当
self.view
实际上不是
SKView?
时),则程序将崩溃以防止进入不一致状态

如果结果
SKView?
不是
nil
,则安全地展开并分配给
view
,否则执行
else
案例(如果有)

if let view = self.view as? SKView { ... }
案例2
self.view
安全地转换为
SKView
。此表达式的结果是一个
SKView
。它将有一个有效值(如果可以进行转换),或者如果无法进行转换,则为
nil
。与第一种情况不同,它不会崩溃

如果结果
SKView?
不是
nil
,则安全地展开并分配给
view
,否则执行
else
案例(如果有)

if let view = self.view as? SKView { ... }
这意味着,如果视图可以强制转换为SKView,则执行该操作,否则不执行该操作。这是安全的,因为它不会使程序崩溃,建议使用。这就是问号的意思。它能被转换成SKView吗

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

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

第一种语法(强制将可选项展开为可选项)在术语上是矛盾的,根本不应该使用。我希望编译器在可选绑定中使用时抛出错误。可能重复@Eric的问题得到了回答吗?我在Xcode 8.2创建的SpriteKit默认演示中获得了这些代码。我认为开发人员使用(as!)是因为他想表示(self.view)已经设置为SKView实例,并且永远不会为零。同时,他想使用(if-let)语法,所以他需要一个可选类型(SKView?)。也许这只是一种习惯,根本没有必要。它会的。@Appzyourlife谢谢,Alexander。虽然我仍然不太理解演示中代码的含义。也许这只是一种语法,不需要太多注意。@Eric我的意思是,我给出的解释完全针对脑海中的特定示例。也许试着问我后续问题ns,我将尝试解决这个困惑。这不仅仅是语法,这两个选项在语义上是不同的。了解它们的区别绝对重要