当设置为零时,NSInvalidArgumentExceptionException UserDefaults
我正在使用UserDefaults
将值存储到首选项中。当设置为零时,NSInvalidArgumentExceptionException UserDefaults
我有一个模板类,并获得价值(需要重写)的方法
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'
Wa如果价值为零,它应该删除密钥吗?
问题是试图在UserDefaults
中存储值NSNull
。这不支持。 nil
是好的,它只是删除任何现有的价值。但NSNull
与nil
不一样。
你需要处理这个问题。这里有一个解决方案:
var val = getValue(value)
if val is NSNull {
val = nil
}
UserDefaults.standard.set(val, forKey: "pref_key")
它的工作,如果我直接设置,但不抛出该方法。我也打印它,是零,我认为这是一个语言限制,也许任何正在改变它在某种方式 – 4bottiglie
我测试“如果”值==零或是NSNull,但“如果”失败没有两种情况下,如果我打印它,输出为零。我无法理解 – 4bottiglie
的行为我发现这个值被包裹进了String?即使是零也会失败的条件。任何想法? – 4bottiglie
你是否从'getValue'方法返回'nil'或'NSNull'? – rmaddy
无,但有些值可能是NSNull,是不是应该支持两者? – 4bottiglie
不,您不能在UserDefaults中存储'NSNull'。 – rmaddy