2016-03-14 25 views
2

說例如我有這樣的課,而不是讓我將分配給init方法的字段,我只是想隱含unwrapped選項。爲什麼隱式解包的選項需要在條件中再次解包?

class foo { 
    willBeSomeBool: Bool! 
    willBeSomeString: String! 
} 

我明白這樣做的原因是,當我宣佈他們,他們將有nil的初始值,因此我並不需要一個init所有類的字段具有初始值。我所需要做的就是確保在我嘗試訪問它們之前分配給他們一些東西,否則我會得到一個致命錯誤。

所以說,我們已經賦值到田間地頭,現在我們在一些方法,就是我要問的是:爲什麼我們需要強行解開了布爾當我們使用它的內部條件?我可以在條件之外訪問其他隱式解包的optionals甚至bool。

func bar() { 
    if willBeSomeBool! { 
    ... 
    } 
} 

func buzz() { 
    print(willBeSomeString) 
} 

我最適合這種猜測是因爲我們仍然可以檢查在暗中展開變量零所以在有條件的情況下它被視爲,如果它只是一個正常的可選的,但就像我說的我最好,也許我錯過了別的東西?

回答

3

爲什麼我們需要強行解開了BOOL當我們使用條件

這是一個歷史問題裏面。曾幾何時,在Swift的早期階段,一個可選項可以作爲詢問它是否爲nil的一種方式。因此有一個擔心,你可能可能認爲if willBeSomeBoolnil測試。因此,您必須明確地測試nil或展開,以便我們擁有一個真正的Bool,從而證明您知道自己在做什麼 - 並防止您誤解自己的結果。

這樣看。你不能說if willBeSomeString。你只能說更明確的東西,要麼if willBeSomeString == nilif willBeSomeString == "howdy"。因此,使willBeSomeBool服從相同的模式是最簡單的。

+0

完美,只是我一直在尋找的答案,歡呼! –

+0

這符合斯威夫特規則,儘量不要給程序員帶來祕密的意義。他們並不總是遵守這個規則,但他們可能會看到他們正在努力;這就是爲什麼'var'參數和遞增/遞減運算符以及C-style for循環消失的原因。 – matt

相關問題