设置 nil UserDefaults 时出现 NSInvalidArgumentException

Posted

技术标签:

【中文标题】设置 nil UserDefaults 时出现 NSInvalidArgumentException【英文标题】:NSInvalidArgumentException when setting nil UserDefaults 【发布时间】:2017-08-12 22:59:29 【问题描述】:

我正在使用UserDefaults 将值存储到首选项中。

我有一个模板类和一个获取值的方法(需要重写)

func getValue(_ value: T?) -> Any?

    return value

当我打电话时:

UserDefaults.standard.set(getValue(value), forKey: "pref_key")

其中value 可以是nil, 我得到这个错误:

由于未捕获的异常而终止应用程序 'NSInvalidArgumentException',原因:'尝试插入非属性 为 key pref_key 列出对象 null

如果值为 nil,它不应该删除键吗?

【问题讨论】:

您是从您的getValue 方法返回nil 还是NSNull nil,但有些值可能是 NSNull,不是应该支持两者吗? 不,您不能在 UserDefaults 中存储 NSNull 【参考方案1】:

问题是试图将NSNull 的值存储在UserDefaults 中。这不受支持。 nil 很好,它只是删除了任何现有值。但是NSNullnil 不是一回事。

你需要处理这个。这是一个解决方案:

var val = getValue(value)
if val is NSNull 
    val = nil

UserDefaults.standard.set(val, forKey: "pref_key")

【讨论】:

如果我直接设置它是有效的,但不抛出该方法。我也打印了它并且是 nil,我认为这是一个语言限制,也许 Any 正在以某种方式改变它 我正在测试“if”值 == nil 还是 NSNull,但“if”没有两种情况都失败,如果我打印它,则输出为 nil。我无法理解这种行为 我发现值被包装成字符串??即使是 nil 也会使 if 条件失败。有什么想法吗?

以上是关于设置 nil UserDefaults 时出现 NSInvalidArgumentException的主要内容,如果未能解决你的问题,请参考以下文章

将 Delegate 分配给 PopoverPresentationController 时出现 Nil 错误

使用 userDefaults 时意外发现 nil

向 Core Data 添加数据时出现问题 - nil 不是合法参数

获取请求不会迅速执行,在请求中传递 URL 时出现 nil 值错误

UIViewController 中的 textLabel.text 在从 NSObject 分配字符串时出现 nil

设置两个对象之间的关系时出现 EXC-BAD-ACCESS