如何处理 Swift 中 NSUserDefaults 中的非可选值
How to deal with non-optional values in NSUserDefaults in Swift
要从 NSUserDefaults
中获取值,我会这样做:
let userDefaults = NSUserDefaults.standardUserDefaults()
if let value = userDefaults.objectForKey(key) {
print(value)
}
但是,这些方法不 return 选项:
boolForKey
(如果没有设置则默认为false
)
integerForKey
(如果没有设置则默认为0
)
floatForKey
(如果没有设置则默认为0.0
)
doubleForKey
(如果没有设置则默认为0.0
)
在我的应用程序中,如果先前已设置,我想使用整数的保存值。如果之前没有设置,我想使用我自己的默认值。问题是 0
是我的应用程序的有效整数值,所以我无法知道 0
是以前保存的值还是默认的未设置值。
我该如何处理?
使用此代码
let userDefaults = NSUserDefaults.standardUserDefaults()
if var value : Int = userDefaults.objectForKey(key) {
print(value)
}
您可以使用 NSUserDefaults.standardUserDefaults.registerDefaults()
为您的应用注册非合法值的默认值
在AppDelegate中注册用户默认值,最好的地方是awakeFromNib
甚至init
。您可以为每个键提供自定义默认值。
override init()
{
let defaults = UserDefaults.standard
let defaultValues = ["key1" : 12, "key2" : 12.6]
defaults.register(defaults: defaultValues)
super.init()
}
然后你可以从任何地方读取值作为非可选值
let defaults = UserDefaults.standard
myVariable1 = defaults.integer(forKey: "key1")
myVariable2 = defaults.double(forKey:"key2")
您可以使用 objectForKey
(returns 是可选的)并使用 as?
将其选择性地转换为 Int
。
if let myInteger = UserDefaults.standard.object(forKey: key) as? Int {
print(myInteger)
} else {
print("no value was set for this key")
}
Bool
、Float
和 Double
的解决方案将以相同的方式工作。
注:
我建议尽可能使用已接受的答案并设置默认值,而不是转换通用对象。
这篇文章很好地描述了如何"make"他们可选http://radex.io/swift/nsuserdefaults/
extension NSUserDefaults {
class Proxy {
var object: NSObject? {
return defaults.objectForKey(key) as? NSObject
}
var number: NSNumber? {
return object as? NSNumber
}
var int: Int? {
return number?.integerValue
}
var bool: Bool? {
return number?.boolValue
}
}
}
要从 NSUserDefaults
中获取值,我会这样做:
let userDefaults = NSUserDefaults.standardUserDefaults()
if let value = userDefaults.objectForKey(key) {
print(value)
}
但是,这些方法不 return 选项:
boolForKey
(如果没有设置则默认为false
)integerForKey
(如果没有设置则默认为0
)floatForKey
(如果没有设置则默认为0.0
)doubleForKey
(如果没有设置则默认为0.0
)
在我的应用程序中,如果先前已设置,我想使用整数的保存值。如果之前没有设置,我想使用我自己的默认值。问题是 0
是我的应用程序的有效整数值,所以我无法知道 0
是以前保存的值还是默认的未设置值。
我该如何处理?
使用此代码
let userDefaults = NSUserDefaults.standardUserDefaults()
if var value : Int = userDefaults.objectForKey(key) {
print(value)
}
您可以使用 NSUserDefaults.standardUserDefaults.registerDefaults()
在AppDelegate中注册用户默认值,最好的地方是awakeFromNib
甚至init
。您可以为每个键提供自定义默认值。
override init()
{
let defaults = UserDefaults.standard
let defaultValues = ["key1" : 12, "key2" : 12.6]
defaults.register(defaults: defaultValues)
super.init()
}
然后你可以从任何地方读取值作为非可选值
let defaults = UserDefaults.standard
myVariable1 = defaults.integer(forKey: "key1")
myVariable2 = defaults.double(forKey:"key2")
您可以使用 objectForKey
(returns 是可选的)并使用 as?
将其选择性地转换为 Int
。
if let myInteger = UserDefaults.standard.object(forKey: key) as? Int {
print(myInteger)
} else {
print("no value was set for this key")
}
Bool
、Float
和 Double
的解决方案将以相同的方式工作。
注:
我建议尽可能使用已接受的答案并设置默认值,而不是转换通用对象。
这篇文章很好地描述了如何"make"他们可选http://radex.io/swift/nsuserdefaults/
extension NSUserDefaults {
class Proxy {
var object: NSObject? {
return defaults.objectForKey(key) as? NSObject
}
var number: NSNumber? {
return object as? NSNumber
}
var int: Int? {
return number?.integerValue
}
var bool: Bool? {
return number?.boolValue
}
}
}