我正在尝试检查UserDefaults密钥是否存在,如果没有将其设置为我选择的标准值,但此处堆栈溢出的答案并没有帮助我实现这一点。
基本上我有几个UISwitch,一个打开,其余的从一开始就设置为关闭。现在我的问题是,当加载viewController并且这些键不存在时,我不知道如何将这些初始状态保存到UserDefaults中。
这就是我试图检查UISwitch的密钥是否存在以及是否将其设置为true的原因(因为那是我希望它的状态),然后再次检查密钥的bool是什么并将UISwitch设置为它(这在另一次打开viewController时非常重要):
func setupSwitches() {
let defaults = UserDefaults.standard
//check if the key exists
if !defaults.bool(forKey: "parallax") {
switchParallax.setOn(true, animated: true)
}
//check for the key and set the UISwitch
if defaults.bool(forKey: "parallax") {
switchParallax.setOn(true, animated: true)
} else {
switchParallax.setOn(false, animated: true)
}
}
当用户按下相应的按钮时,我设置了UserDefaults键,如下所示:
@IBAction func switchParallax_tapped(_ sender: UISwitch) {
let defaults = UserDefaults.standard
if sender.isOn == true {
defaults.set(true, forKey: "parallax")
} else {
defaults.set(false, forKey: "parallax")
}
}
这显然有效,但问题出在上面的第一个代码中。
首先,我不确定如何检查它是否存在,如果没有将其设置为" true"由于该函数名为setupSwitches(),因此每次显示viewController时都会运行该函数。
所以我不知道是否有更好的方法(例如,由于内存问题)来检查密钥是否存在,如果没有将其设置为true并且如果它已经存在则从UserDefaults获取bool并且将开关设置为正确的状态。
答案 0 :(得分:8)
问题是您无法确定是否存在UserDefaults.standard.bool(forKey: key)
。 UserDefaults.standard.object(forKey: key)
会返回Any?
,因此您可以使用它来测试nil,例如
extension UserDefaults {
static func exists(key: String) -> Bool {
return UserDefaults.standard.object(forKey: key) != nil
}
}