【问题标题】:Reading missing values from UserDefaults从 UserDefaults 中读取缺失值
【发布时间】:2016-09-11 15:57:47
【问题描述】:

我想将字体大小存储在用户默认值中并在下次运行时读取。 但是在第一次运行时,当我使用下面的代码检查字体大小时,它返回 0,而我预计会出现异常或类似的情况,表明该值之前未保存:

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

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

苹果文件说: 与指定键关联的浮点值。如果key不存在,这个方法返回0。

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

【问题讨论】:

    标签: swift nsuserdefaults swift3 userdefaults


    【解决方案1】:

    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...
        }
    

    【讨论】:

      【解决方案2】:

      我期待一个异常或类似的东西,它说这个值是 之前没有保存

      Swift 不支持异常

      但我不喜欢 0

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

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

      我假设您不允许用户将字体大小设置为 0,因此如果值为 0,则表示尚未设置。

      【讨论】:

        【解决方案3】:

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

        只限制用户选择大于0的字体大小。这样,如果你从用户默认值中得到一个0,你就会知道这个值还没有被设置。

        如果有效范围包括0怎么办?

        这是一个蛮力解决方案,但它仍然有效。

        当您保存该值时,请始终将其加一。当你得到这个值时,减去一个。同样,如果您得到 0,您就知道该值尚未设置。

        【讨论】:

        • 我猜你误读了这个问题。它说“在第一次运行......返回0”。这意味着用户还没有采取任何行动,但是对于未设置的值,返回默认值为 0(参见 OOPer 的帖子)。
        • @Michael 我没有。我的观点是 0 无论如何都不是有效的字体大小,所以回答“我想知道这个值之前是否存储过!”这个问题的答案。是“检查是否为0”。
        • 这可能是这个特定问题的合适答案,但如果变量代表其他内容,那么 0 可能是有效条目,您的方法将失败。
        【解决方案4】:

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

        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")
        }
        

        【讨论】:

          【解决方案5】:

          正如documentation for UserDefaults 告诉您的那样:您可以(并且出于您的目的可能应该)为这些值设置默认值。你必须添加

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

          到您的 AppDelegate didFinishLaunchingWithOptions。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-05-28
            • 2018-10-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-05-09
            • 1970-01-01
            相关资源
            最近更新 更多