2016-12-16 98 views
1

我刚刚构建了一个SpriteKit演示应用程序。 我下面(as!SKView?)和(as?SKView)之间的区别

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

的代码是什么(如self.view!SKView?),这意味着在不? 为什么他们不写这样的代码:

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

有什么区别? 非常感谢!

+0

第一种语法(*强制展开*可选的可选项)是一个矛盾,并且根本不应该使用。我希望编译器在可选绑定中使用时发生错误。 – vadian

+0

[在Swift中转换为泛型可选]的可能副本(http://stackoverflow.com/questions/32080420/casting-to-generic-optional-in-swift) –

+0

@Eric你的问题得到了解答吗? – Alexander

回答

1

案例1

self.view是力铸于(又名Optional<SKView>)。如果此投射失败(当self.view实际上不是)时,程序将崩溃以防止进入不一致状态。

产生的然后展开安全并分配给view如果不是nil,否则,在执行else情况下,如果有一个。

案例2

self.view安全地转换为SKView。这个表达式的结果是SKView。它会有一个有效的值(如果演员是可能的话),或者如果演员不可能的话nil。不像第一种情况,它不会崩溃。

产生的然后展开安全并分配给view如果不是nil,否则,在执行else情况下,如果有一个。

+0

它会。http://swiftlang.ng.bluemix.net/#/repl/5853c53e6749731cc79801b0 @AppzYourLife – Alexander

+0

谢谢,亚历山大。仍然不完全理解演示中代码的含义,也许它只是一种语法,不需要太多关注 – Rufus

+0

@Eric我的意思是,我给出了解释,正是为了解决特定的例子,也许试着问我跟进问题,我会尽力解决这个困惑。这不仅仅是语法,这两个选项在语义上是不同的。了解其中的差异非常重要 – Alexander

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

这意味着,如果视图可以转换为SKView,那么做,否则不要这样做。这是安全的,因为它不会使程序崩溃并且被推荐。这就是问号的含义。它可以铸造成SKView吗?

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

这真的不应该使用。你说这个视图应该强制转换为一个可选的SKView,如果SKView可以解包,它将会起作用。就像其他用户所说,它是重复性的,即使它不会给你一个错误也不应该使用。

相关问题