2016-12-16 96 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可以解包,它將會起作用。就像其他用戶所說,它是重複性的,即使它不會給你一個錯誤也不應該使用。

相關問題