2017-08-12 24 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