2016-12-02 2 views
1

У меня есть изрядное количество кода, который выглядит примерно так ...Swift 3 и UserDefaults

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

Идея заключалась в том, что если по умолчанию не включает этот ключ, он все равно получит то по умолчанию стоимость. Это работало отлично в Swift 2, но в Swift 3 предупреждает ...

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

Таким образом, кажется, что UserDefaults.standard.bool будет всегда возвращает значение, которое я думаю имеет смысл, если это 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")) 
Смежные вопросы