如何处理 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 选项:

在我的应用程序中,如果先前已设置,我想使用整数的保存值。如果之前没有设置,我想使用我自己的默认值。问题是 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")
}

BoolFloatDouble 的解决方案将以相同的方式工作。

注:

我建议尽可能使用已接受的答案并设置默认值,而不是转换通用对象。

这篇文章很好地描述了如何"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
        }
    }
}