2016-12-02 151 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"))