2016-11-07 51 views
3

新斯威夫特,看到代碼斯威夫特編程如下的斯坦福開放課程:爲什麼打開一個不能爲零的變量?

if pending != nil { 
    acccumulator = pending!.binaryFunction(pending!.firstOperand,acccumulator) 
    pending = nil 
} 

當我瞭解展開,pending,在這種情況下,保證不被零裏面if塊,那麼爲什麼要我使用!在使用它時打開掛起?

+2

相關:[Swift可選參數未解包](http://stackoverflow.com/questions/40290202/swift-optional-parameter-not-unwrapped) – Hamish

回答

4

因爲if檢查對塊內的代碼沒有影響。在這個例子中,你應該使用一個let,像這樣:

if let nonNilPending = pending { 
    acccumulator = nonNilPending.binaryFunction(nonNilPending.firstOperand,acccumulator) 
    pending = nil 
} 

這樣,你避免了力解開。

+0

雖然我仍然對Swift感到困惑,但我仍然可以推斷出很多東西,爲什麼它的編譯器無法弄清楚在這樣的可選變量中是不可能的情況?我假設Swift中'可選'的概念在C++中是'null'的...因此,如果可以阻止內部塊使用nil或void或null變量執行。 –

4

即使您知道pending不是nil,它的類型仍然是可選的。編譯器在各種上下文中(即if的內部和外部)並沒有以不同的方式對待它,因此您必須在兩個地方都使用!運算符。

Swift確實爲您提供了一個機制來檢查nil並拆開一個if let construct,這是一個方便的替代強制解包。

2

因爲即使你在那個塊中,編譯器也不知道該變量是「解包」的。最重要的是,使用force unwrap是個不錯的主意。如果if條件解開變量,然後使用你設置的常量,你會更好。例如:

if let unwrappedPending = pending { 
    accumulator = unwrappedPending.binaryFunction(...) 
    pending = nil 
} 

通過設置可選pending的常數,你有條件地展開它。然後,你可以使用恆定的知道該常數不是零的安全性,你不必使用!

相關問題