从UserDefaults中读取缺失值

时间:2016-09-11 15:57:47

标签: swift nsuserdefaults swift3 userdefaults

我想在用户默认值中存储字体大小,并在下次运行中读取它。 但是在第一次运行时,当我使用下面的代码检查字体大小时,它返回0,而我期望一个异常或类似的东西,表示此值未在之前保存:

let font_size=CGFloat(UserDefaults.standard.float(forKey: "fontsize"))

现在font_size为0,应为零或抛出异常!

Apple文件说: 与指定键关联的浮点值。如果该键不存在,则此方法返回0.

但我不喜欢 0 但是我想知道这个值是否存储在之前是否存在!

5 个答案:

答案 0 :(得分:3)

NSUserDefaults使用NSNumber来保存数值,因此您可以编写如下内容:

    if UserDefaults.standard.object(forKey: "fontsize") != nil {
        let fontSize = CGFloat(UserDefaults.standard.float(forKey: "fontsize"))
        //use `fontSize`...
    } else {
        //first run...
    }

或者:

    if let fontSize = UserDefaults.standard.object(forKey: "fontsize") as? CGFloat {
        //use `fontSize`...
    } else {
        //first run...
    }

答案 1 :(得分:2)

  

我期待一个例外或类似的东西,说这个值是   

之前未保存

Swift

不支持例外
  

但我不喜欢0

使用registerDefaults提供您自己的基础值。

  

但我想知道这个值是否存储在之前是否存在!

我假设您不允许用户设置字体大小0,因此如果该值为0,则意味着它尚未设置。

答案 2 :(得分:1)

首先,我认为0作为名为fontSize的变量的值是没有意义的。你怎么能有大小为0的文字?所以这根本不是问题。

只需限制用户选择大于0的字体大小。这样,如果从用户默认值中得到0,您就会知道该值尚未设置。

如果有效范围包括0?

,该怎么办?

这是一个强力解决方案,但无论如何都可行。

保存值时,请务必添加一个值。当你得到值时,减去一个。同样,如果你得到0,你知道该值尚未设定。

答案 3 :(得分:1)

您可以在检查应用的首次运行时注册默认值。

func checkFirstRun() {
    let currentVersion = (Bundle.main.infoDictionary!["CFBundleShortVersionString"] as! String) + " (" + (Bundle.main.infoDictionary!["CFBundleVersion"] as! String) + ")"
    let defaults = UserDefaults.standard
    let value = defaults.dictionaryRepresentation()["KEY_FOR_INSTALLED_VERSION"]
    if(value == nil) {
        // first run after installation
        var appDefaults = Dictionary<String, Any>()
        appDefaults["fontsize"] = YOUR_DEFULT_FONT_SIZE            
        defaults.register(defaults: appDefaults)
    } else if(currentVersion != (defaults.object(forKey: "KEY_FOR_INSTALLED_VERSION") as! String)) {
        // app update            
    }
    defaults.set(currentVersion, forKey: "KEY_FOR_INSTALLED_VERSION")
}

答案 4 :(得分:0)

正如documentation for UserDefaults告诉您:您可以(并且可能为了您的目的)为值设置默认值。你必须添加

let userDefaults = UserDefaults.standard
let appDefaults: [String:Any] = ["fontSize" : 10,
                                 "anotherUserDefaultValue" : "Not found",
                                 "firstLaunch" : true]
userDefaults.register(defaults: appDefaults)

到您的AppDelegate didFinishLaunchingWithOptions。