新斯威夫特,看到代碼斯威夫特編程如下的斯坦福開放課程:爲什麼打開一個不能爲零的變量?
if pending != nil {
acccumulator = pending!.binaryFunction(pending!.firstOperand,acccumulator)
pending = nil
}
當我瞭解展開,pending
,在這種情況下,保證不被零裏面if
塊,那麼爲什麼要我使用!
在使用它時打開掛起?
新斯威夫特,看到代碼斯威夫特編程如下的斯坦福開放課程:爲什麼打開一個不能爲零的變量?
if pending != nil {
acccumulator = pending!.binaryFunction(pending!.firstOperand,acccumulator)
pending = nil
}
當我瞭解展開,pending
,在這種情況下,保證不被零裏面if
塊,那麼爲什麼要我使用!
在使用它時打開掛起?
因爲if
檢查對塊內的代碼沒有影響。在這個例子中,你應該使用一個let
,像這樣:
if let nonNilPending = pending {
acccumulator = nonNilPending.binaryFunction(nonNilPending.firstOperand,acccumulator)
pending = nil
}
這樣,你避免了力解開。
雖然我仍然對Swift感到困惑,但我仍然可以推斷出很多東西,爲什麼它的編譯器無法弄清楚在這樣的可選變量中是不可能的情況?我假設Swift中'可選'的概念在C++中是'null'的...因此,如果可以阻止內部塊使用nil或void或null變量執行。 –
即使您知道pending
不是nil
,它的類型仍然是可選的。編譯器在各種上下文中(即if
的內部和外部)並沒有以不同的方式對待它,因此您必須在兩個地方都使用!
運算符。
Swift確實爲您提供了一個機制來檢查nil
並拆開一個if let
construct,這是一個方便的替代強制解包。
因爲即使你在那個塊中,編譯器也不知道該變量是「解包」的。最重要的是,使用force unwrap是個不錯的主意。如果if條件解開變量,然後使用你設置的常量,你會更好。例如:
if let unwrappedPending = pending {
accumulator = unwrappedPending.binaryFunction(...)
pending = nil
}
通過設置可選pending
的常數,你有條件地展開它。然後,你可以使用恆定的知道該常數不是零的安全性,你不必使用!
相關:[Swift可選參數未解包](http://stackoverflow.com/questions/40290202/swift-optional-parameter-not-unwrapped) – Hamish