2016-09-19 31 views
0

我有一段代碼,如果開關已經在設置被設置爲如下運行:防範開關按鈕具有零可選值

UserDefaults.standard.bool(forKey: "signatureSwitchState") 

     let buttonState = UserDefaults.standard.object(forKey: "signatureSwitchState") as! Bool 

     if buttonState == true { 

      sign() 

     } 

我的問題是,如果開關從未被激活程序失敗,因爲編譯器指出,「致命錯誤:意外發現零,同時展開一個可選值」

我的問題是如何最好的防止在使用bool如上述語句中的開關的零值。

我試過如果讓語句和警衛語句,但編譯器抱怨這些不能用於布爾。

+0

可能的重複[什麼是「致命錯誤:意外發現零,而解包可選值」是什麼意思?](http://stackoverflow.com/questions/32170456/what-does-fatal-error-unexpectedly-found-零 - 解包 - 可選價值) –

回答

0

有幾種方法可以做到這一點。由於這是一個布爾值,它可能是最簡單的只是使用未繳合併??

let buttonState = UserDefaults.standard.object(forKey: "signatureSwitchState") as? Bool ?? false 

或者,你可以使用guard做到這一點,這可能是更強大的:

guard let buttonState = UserDefaults.standard.object(forKey: "signatureSwitchState") as? Bool else { return } 
if buttonState == true { 
    sign() 
} 

注意,在在這兩種情況下,您必須將強制解包(!)更改爲可選的解包(?)。

0

我有一個提示可能會在未來有用,雖然它不如piccianoanswer這絕對是正確的方法。

UserDefaults.standard.object(forKey: "signatureSwitchState")返回AnyObject

如果你試圖迫使投地Boolas! Bool),如果返回值不是Bool,或者如果它是nil這將崩潰。相反,如果您有條件地投(as? Bool),您將收到Bool?。這將值轉換爲Bool如果它存在,否則它會給你nil(沒有崩潰。

從那裏,你可以通過使用無合併運算符(??)這Bool?轉換爲Bool,它會返回你Bool值(如果有),否則它會回報你給它的默認值。在這種情況下,false

同時,由於buttonState已經是Bool,沒有理由給它比較trueif聲明。直接使用它:

let buttonState = UserDefaults.standard.object(forKey: "signatureSwitchState") as? Bool ?? false 
if buttonState { 
    sign() 
} 
1

你應該使用:

let buttonState = UserDefaults.standard.bool(forKey: "signatureSwitchState") 

如果該值未明確設置,它會返回false。

1

如果你正在試圖獲得來自UserDefaults一個布爾值,你可以使用

let buttonState = UserDefaults.standard.bool(forKey: "signatureSwitchState")

這個函數返回一個布爾值,讓你知道該值只能是真或假,如果它不找不到密鑰的值,那麼它將返回false。您正在使用

UserDefaults.standard.object(forKey: "signatureSwitchState")

該函數返回一個AnyObject?所以它可以是零。

1

鮮爲人知,但強烈建議蘋果:它被認爲是直到用戶改變值首次

註冊的默認值。

applicationDidFinishLaunching - 至少在第一次訪問該值之前 - 註冊鍵/值對。

let userDefaults = UserDefaults.standard 
let defaultValues : [String : Any] = ["signatureSwitchState" : false] 
userDefaults.register(defaults: defaultValues) 

現在的價值是永遠nil(我知道Bool例子是相當弱)

let buttonState = UserDefaults.standard.bool(forKey: "signatureSwitchState") 

目的採取的這種方式更優勢比「原始」類型的從來都不nil反正。

+0

太好了。這應該更爲人所知。 – brandonscript