保存到 NSUserDefaults 的字典总是返回 nil

Posted

技术标签:

【中文标题】保存到 NSUserDefaults 的字典总是返回 nil【英文标题】:Dictionary saved to NSUserDefaults always returns nil 【发布时间】:2016-05-02 05:53:10 【问题描述】:

我正在尝试使用setObject() 函数将字典保存到NSUserDefaults,但是当我使用objectForKey() 函数检索字典时,它返回nil。为什么会这样?

var data = NSUserDefaults.standardUserDefaults();
var scoreboard = [Int : String]()
let scores = "scoresKey"

scoreboard[3] = "spencer"
scoreboard[6] = "***e"
scoreboard[11] = "jason"

data.setObject(scoreboard, forKey: scores)
data.objectForKey(scores) // Returns nil

【问题讨论】:

你需要在一个真实的项目上测试它。不是游乐场 【参考方案1】:

第一个问题是不可能在 Playground 中使用 NSUserDefaults。

见:https://***.com/a/31210205/3498950

上面的代码在正常的ios项目中运行时发现了第二个问题。它抛出一个NSInvalidArgumentException,因为字典是一个非属性列表对象,因为键需要是字符串类型。

虽然 NSDictionary 和 CFDictionary 对象允许它们的键是 任何类型的对象,如果键不是字符串对象,则 集合不是属性列表对象。

请参阅:Apple 文档中的“What is a Property List?”

【讨论】:

您是否尝试过上面的确切代码?它对我不起作用。它抛出异常:“尝试将非属性列表对象 6 = ***e; 3 = spencer; 11 = jason; 设置为键 scoreKey 的 NSUserDefaults/CFPreferences 值”。 (这是因为“property-list”字典必须有字符串作为键。请参阅 Apple 文档中的 "What is a property list?" 以及 this question。)

以上是关于保存到 NSUserDefaults 的字典总是返回 nil的主要内容,如果未能解决你的问题,请参考以下文章

将带有 NSAttributed 字符串的字典保存到 PList 或 NSUserDefaults

NSUserDefaults 并不总是保存我的 NSString 数据

无法从 NSUserDefaults 获取字典作为保存格式

iOS NSDictionary 保存到 NSUserDefaults 不保存值

无法更新 NSUserDefaults 中字典的键值

如何快速在 NSUserDefaults 中设置字典?