设置 nil UserDefaults 时出现 NSInvalidArgumentException

NSInvalidArgumentException when setting nil UserDefaults

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

我有一个模板 class 和一个获取值的方法(需要被覆盖)

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

当我打电话时:

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

其中 value 可以是 nil, 我收到此错误:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Attempt to insert non-property list object null for key pref_key'

如果值为 nil,难道不应该删除密钥吗?

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

你需要处理这件事。这是一种解决方案:

var val = getValue(value)
if val is NSNull {
    val = nil
}
UserDefaults.standard.set(val, forKey: "pref_key")