如何在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") } 

BoolFloatDouble的解决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) }