2016-12-02 164 views
1

我的代碼看起來像這樣有相當數量...斯威夫特3個UserDefaults

let wantsIgnored = UserDefaults.standard.bool(forKey: "ViewShowIgnoredElements") ?? true 

當時的想法是,如果違約不包括那把鑰匙,它仍然會得到合理的默認值。這工作得很好斯威夫特2,但在斯威夫特3它警告...

Left side of nil coalescing operator '??' has non-optional type 'Double', so the right side is never used 

如此看來,UserDefaults.standard.bool總是返回一個值,我的猜測是有道理的,如果它是一個布爾值。好的,但是解決這個問題的最好方法是什麼?我可以使用objectForKey來檢查每個密鑰,但這會使代碼更加混亂。或者我根本無法做這個檢查,並且確保每個按鍵都在最初的一組默認值中,我猜想是手動的。

我確定我不是唯一一個遇到過這個問題,任何規範的解決方案?

回答

2

我怕你會覺得這是凌亂,但你可以寫這樣的事情:

let wantsIgnored = UserDefaults.standard.object(forKey: "ViewShowIgnoredElements") as? Bool ?? true 

請嘗試。

+0

這根本不亂,我非常喜歡它! –

0

它不應該是:

let wantsIgnored = UserDefaults.standard.set(true, forKey: "ViewShowIgnoredElements") 

然後改變它:

UserDefaults.standard.set(false, forKey: "ViewShowIgnoredElements") 

,並呼籲它:

let xxxx = UserDefaults.standard.bool(forKey: "ViewShowIgnoredElements") 

或:

func boolTest (_myBool: Bool){ 
    if _myBool{ 
     //do something 
    } 
} 

//and call that function 
boolTest(_myBool: UserDefault.standard.bool(forKey: "ViewShowIgnoredElements"))