如何处理Swift中NSUserDefaults中的非可选值

时间:2015-09-18 06:44:21

标签: ios swift nsuserdefaults optional

要从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是否是以前保存的值,或者它是否是默认的未设置值。

我该如何处理?

5 个答案:

答案 0 :(得分:3)

在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")

答案 1 :(得分:3)

您可以使用objectForKey(返回可选项)并使用as?可选择将其投放到Int

if let myInteger = UserDefaults.standard.object(forKey: key) as? Int {
    print(myInteger)
} else {
    print("no value was set for this key")
}

BoolFloatDouble的解决方案可以采用相同的方式。

注意:

我建议使用接受的答案并设置默认值,而不是在可能的情况下投射通用对象。

答案 2 :(得分:0)

您可以使用NSUserDefaults.standardUserDefaults.registerDefaults()

为您的应用注册不是合法值的默认值

答案 3 :(得分:0)

本文非常详细地介绍如何“制作”它们可选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
        }
    }
}

答案 4 :(得分:-1)

使用此代码

let userDefaults = NSUserDefaults.standardUserDefaults()
if var value : Int = userDefaults.objectForKey(key) {
    print(value)
}