1

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

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

现在font_size是 0 应该是 nil 或者抛出异常!

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

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

4

5 回答 5

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...
    }
于 2016-09-11T16:17:10.220 回答
2

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

Swift 不支持异常

但我不喜欢0

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

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

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

于 2016-09-11T16:24:33.420 回答
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")
}
于 2016-09-11T18:20:24.080 回答
1

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

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

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

这是一个蛮力解决方案,但无论如何它都有效。

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

于 2016-09-11T16:54:22.980 回答
0

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

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

到您的 AppDelegate didFinishLaunchingWithOptions。

于 2017-09-08T07:00:13.660 回答