2017-08-12 64 views
0

我正在使用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如果价值为零,它应该删除密钥吗?

+0

你是否从'getValue'方法返回'nil'或'NSNull'? – rmaddy

+0

无,但有些值可能是NSNull,是不是应该支持两者? – 4bottiglie

+1

不,您不能在UserDefaults中存储'NSNull'。 – rmaddy

回答

1

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

你需要处理这个问题。这里有一个解决方案:

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

它的工作,如果我直接设置,但不抛出该方法。我也打印它,是零,我认为这是一个语言限制,也许任何正在改变它在某种方式 – 4bottiglie

+0

我测试“如果”值==零或是NSNull,但“如果”失败没有两种情况下,如果我打印它,输出为零。我无法理解 – 4bottiglie

+0

的行为我发现这个值被包裹进了String?即使是零也会失败的条件。任何想法? – 4bottiglie