How to deal with non-optional values in NSUserDefaults in Swift

僤鯓⒐⒋嵵緔 提交于 2019-12-08 20:58:34

Register the user defaults in AppDelegate, the best place is awakeFromNib or even init. You can provide custom default values for every key.

 override init()
 {
   let defaults = NSUserDefaults.standardUserDefaults()
   let defaultValues = ["key1" : 12, "key2" : 12.6]
   defaults.registerDefaults(defaultValues)
   super.init()
 }

Then you can read the values from everywhere always as non-optionals

let defaults = NSUserDefaults.standardUserDefaults()
myVariable1 = defaults.integerForKey("key1")
myVariable2 = defaults.doubleForKey("key2")

You can use objectForKey (which returns an optional) and use as? to optionally cast it to an Int.

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

The solutions for Bool, Float, and Double would work the same way.

Note:

I recommend going with the accepted answer and setting default values rather than casting a generic object if possible.

You could register defaults for your app that aren't legitimate values using NSUserDefaults.standardUserDefaults.registerDefaults()

This article describes very well how to "make" them Optional 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
        }
    }
}

Use this code

let userDefaults = NSUserDefaults.standardUserDefaults()
if var value : Int = userDefaults.objectForKey(key) {
    print(value)
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!