【问题标题】:Store dictionary with optional values [String: AnyObject?] in NSUserDefaults在 NSUserDefaults 中存储具有可选值 [String: AnyObject?] 的字典
【发布时间】:2016-04-11 00:02:17
【问题描述】:

我需要存储一个可以包含 nil 作为值的字典

例子

var someOptionalVar: String? = nil

var dict: [String: AnyObject?] = [
    "someOptionalVar": self.someOptionalVar
]

defaults.setObject(dict, forKey: self.nsUserDefaultsKey)

但它给了我这个错误

无法将“[String: AnyObject?]”类型的值转换为预期值 参数类型'AnyObject?'

我知道我可以保留 nil 变量,然后当我从 NSUserDefaults 解析字典时,我会将变量(对应于缺少的属性)设置为 nil,但这不是我想做的。

那么如何在 NSUserDefaults 中存储 nil 值?

【问题讨论】:

  • 这看起来很相似:stackoverflow.com/a/34053503/3402095
  • 我正要发布那个链接。看起来它不适用于可选项,因为它们不能由 Foundation 类型表示。
  • @Whirlwind 类似但不一样,这是OptionalArray,这是OptionalDictionary。如果您想在默认值中明确指出某个键的值是nil,那么NSNull 可能是最好的。如果键值对不在Dictionary 中,也可以省略键并将值假定为nil
  • 归根结底,您不能在 NSUserDefaults 中存储任何无法桥接到 Objective-C 类型之一的内容...... Swift 字典必须能够桥接到 NSDictionary,这意味着没有可选项。
  • 在 Swift Dictionary 中,键和值都必须是非可选的,因为将 nil 分配给键会从字典中删除键。

标签: swift nsuserdefaults


【解决方案1】:

使用 NSNull() 代替 nil,并声明字典只包含非可选:

var someOptionalVar: String? = nil

var dict: [String: AnyObject] = [
    "someOptionalVar": self.someOptionalVar ?? NSNull()
]

defaults.setObject(dict, forKey: self.nsUserDefaultsKey)

【讨论】:

  • 您可以将(self.someOptionalVar != nil) ? self.someOptionalVar : NSNull() 替换为nil coalescing operator ??,如下所示:self.someOptionalVar ?? NSNull()
  • 您的答案与问题不太一样。 OP 的代码创建了一个 [String: AnyObject?] 的字典,但您有一个 [String: AnyObject] 的字典。我自己不知道这个问题的答案,但它似乎与字典中可选的 AnyObject 有关。我重写了 OP 的代码,但将可选的 AnyObject 去掉了,它运行良好。
  • @WERUReo Swift 中的一个可选项转换为 Foundation 类中的一个 nil 指针。基础集合类不能包含 nil 所以NSNull is used instead。因此,您想要存储在默认值中的任何内容都应从Optional 转换为具体值或NSNull。或者,您可以将Dictionary 转换为使用非Optional 值并删除具有nil 值的键。
  • 我的错误。在答案中提到不仅使用了 NSNull() 并且添加到 NSUserDefaults 的字典未定义为包含可选项,这是否会有所帮助?
  • 感谢@WERReo 的cmets。我编辑了答案以包含您的建议
猜你喜欢
  • 2017-05-11
  • 2014-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多