我想在用户默认值中存储字体大小,并在下次运行中读取它。 但是在第一次运行时,当我使用下面的代码检查字体大小时,它返回0,而我期望一个异常或类似的东西,表示此值未在之前保存:
let font_size=CGFloat(UserDefaults.standard.float(forKey: "fontsize"))
现在font_size
为0,应为零或抛出异常!
Apple文件说: 与指定键关联的浮点值。如果该键不存在,则此方法返回0.
但我不喜欢 0 但是我想知道这个值是否存储在之前是否存在!
答案 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。