将可选的布尔值存储在NSUserDefaults中

3

我想在NSUserDefaults中存储一个可选的bool,其中所有三种状态都具有意义:

  • nil -> 尚未设置
  • true/false -> 已明确设置为此值

目前看来,如果从NSUserDefaults检索bool,如果未设置,则返回false,这对于上述用例不起作用。

我不想使用enum,因为它似乎对我想要实现的内容来说过于繁琐。

我是否漏掉了什么重要信息?


如果所有三个状态都真正有意义,也许布尔值类型不是正确的值类型使用? - Magnas
不要存储任何东西来表示 nil? - Joakim Danielson
2个回答

5
您可以直接从UserDefaults中获取值,并尝试将其转换为Bool。如果没有该密钥的值,则会获得nillet myBool = UserDefaults.standard.object(forKey: "BoolKey") as? Bool 或者 let myBool = UserDefaults.standard.value(forKey: "BoolKey") as? Bool 在这两种情况下,myBool均为nil
感谢user28434的补充。

*object(forKey:). value(forKey:)是来自完全不同领域的无关函数。 - user28434'mstep
事实上,你是正确的,但对于UserDefaults而言,object(forKey:)在幕后作为value(forKey:)工作。 - Grigory Serebryanyy
很确定它不会。value(forKey:) 可能会调用 UserDefaultsobject(forKey:) 方法。但反过来则不行。 - user28434'mstep

2
BoolIntDoubleUserDefaults中被视为非可选类型,如果键不存在,则所有专用的getter方法都会返回0/false
解决方法是先使用object(forKey检查是否为nil,或者保存一个字符串并实现一个计算属性来映射类型。
实际上,“未设置”和“false”之间有区别吗?

4
在实践中,“不设定”和“虚假”真的有区别吗?是的。想象一下问题:“你要加薯条吗?”回答“不要”和还没被问到这个问题之间是有区别的。 - JeremyP
因为测试密钥是否存在是处理这个问题的正确方法,所以我点了赞。 - JeremyP

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接