如何在Swift中处理NSUserDefaults中的非可选值
要从NSUserDefaults
得到一个值,我会做这样的事情:
let userDefaults = NSUserDefaults.standardUserDefaults() if let value = userDefaults.objectForKey(key) { print(value) }
但是,这些方法不会返回可选项:
-
boolForKey
(如果未设置,则默认为false
) -
integerForKey
(如果未设置,则默认为0
) -
floatForKey
(如果未设置,则默认为0.0
) -
doubleForKey
(如果未设置,则默认为0.0
)
在我的应用程序,我想使用保存的整数值,如果它已经被设置。 如果以前没有设置,我想使用我自己的默认值。 问题是0
是我的应用程序的有效整数值,所以我无法知道0
是否是以前保存的值,或者如果它是默认的未设置值。
我将如何处理这个?
在AppDelegate中注册用户默认值,最好的地方是awakeFromNib
甚至init
。 您可以为每个键提供自定义的默认值。
override init() { let defaults = NSUserDefaults.standardUserDefaults() let defaultValues = ["key1" : 12, "key2" : 12.6] defaults.registerDefaults(defaultValues) super.init() }
然后,你可以从任何地方读取值作为非可选项
let defaults = NSUserDefaults.standardUserDefaults() myVariable1 = defaults.integerForKey("key1") myVariable2 = defaults.doubleForKey("key2")
我只是发现了一些似乎有用的东西。 我可以继续使用objectForKey
(它返回一个可选的),并使用as?
可选地将其转换为一个Int
。
if let myInteger = userDefaults.objectForKey(key) as? Int { print(myInteger) } else { print("no value was set for this key") }
Bool
, Float
和Double
的解决scheme将以同样的方式工作。
您可以使用NSUserDefaults.standardUserDefaults.registerDefaults()
为您的应用程序注册非合法值的默认值
本文很好地描述了如何“制作”它们可选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 } } }
使用这个代码
let userDefaults = NSUserDefaults.standardUserDefaults() if var value : Int = userDefaults.objectForKey(key) { print(value) }