简体   繁体   English

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

[英]How to deal with non-optional values in NSUserDefaults in Swift

To get a value from NSUserDefaults I would do something like this:要从NSUserDefaults获取值,我会执行以下操作:

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

However, these methods do not return optionals:但是,这些方法不返回可选项:

  • boolForKey (defaults to false if not set) boolForKey (如果未设置,则默认为false
  • integerForKey (defaults to 0 if not set) integerForKey (如果未设置,则默认为0
  • floatForKey (defaults to 0.0 if not set) floatForKey (如果未设置,则默认为0.0
  • doubleForKey (defaults to 0.0 if not set) doubleForKey (如果未设置,则默认为0.0

In my app I want to used the saved value of an integer if it has been previously set.在我的应用程序中,如果之前设置了整数,我想使用它的保存值。 And if it wasn't previously set, I want to use my own default value.如果之前没有设置,我想使用我自己的默认值。 The problem is that 0 is a valid integer value for my app, so I have no way of knowing if 0 is a previously saved value or if it is the default unset value.问题是0是我的应用程序的有效整数值,所以我无法知道0是以前保存的值还是默认的未设置值。

How would I deal with this?我将如何处理?

You can use objectForKey (which returns an optional) and use as?您可以使用objectForKey (它返回一个可选的)并使用as? to optionally cast it to an Int .可选择将其转换为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. BoolFloatDouble的解决方案将以相同的方式工作。

Note:笔记:

I recommend going with the accepted answer and setting default values rather than casting a generic object if possible.如果可能,我建议使用接受的答案并设置默认值,而不是强制转换通用对象。

Register the user defaults in AppDelegate, the best place is awakeFromNib or even init .在 AppDelegate 中注册用户默认值,最好的地方是awakeFromNib甚至init You can provide custom default values for every key.您可以为每个键提供自定义默认值。

 override init()
 {
   let defaults = UserDefaults.standard
   let defaultValues = ["key1" : 12, "key2" : 12.6]
   defaults.register(defaults: defaultValues)
   super.init()
 }

Then you can read the values from everywhere always as non-optionals然后你可以从任何地方读取值作为非可选值

let defaults = UserDefaults.standard
myVariable1 = defaults.integer(forKey: "key1")
myVariable2 = defaults.double(forKey:"key2")

您可以使用NSUserDefaults.standardUserDefaults.registerDefaults()为您的应用注册不是合法值的默认值

This article describes very well how to "make" them Optional http://radex.io/swift/nsuserdefaults/本文很好地描述了如何“制作”它们可选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)
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM