Swift:如何检查UserDefaults是否存在以及是否保存选定的标准值?

时间:2017-11-30 19:59:03

标签: ios xcode boolean nsuserdefaults uiswitch

我正在尝试检查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并且将开关设置为正确的状态。

1 个答案:

答案 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
    }

}