无法修改存储在NSUserDefaults中的数组

时间:2016-08-01 17:08:25

标签: ios swift nsuserdefaults

在班级FirstViewController中,我在以下行中向NSUserDefaults添加了一个带有键rentedItems的数组:

let itemArray = [Item]()
let prefs:NSUserDefaults = NSUserDefaults.standardUserDefaults()
prefs.setObject(itemArray, forKey: "rentedItems")

然后,在另一个班级SecondViewController中,我尝试

var item: Item?
var prefs:NSUserDefaults = NSUserDefaults.standardUserDefaults()    

func confirmPressed() {
    prefs.arrayForKey("rentedItems")?.append(item)
}

然后会出现以下错误: Cannot use mutating member on immutable value: function call returns immutable value。我在SO here中看到了一个解决问题的解决方案,但是NSUserDefaults是一个默认的iOS类,我不能使用相同的解决方案。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

您需要将自定义对象阵列存档到NSData中,然后将其保存到NSUserDefaults并从NSUserDefaults中检索它并再次取消归档。你可以这样存档:

var userDefaults = NSUserDefaults.standardUserDefaults()
let encodedData = NSKeyedArchiver.archivedDataWithRootObject(itemArray)
userDefaults.setObject(encodedData, forKey: "rentedItems")
userDefaults.synchronize()

并像这样取消归档

let decoded  = userDefaults.objectForKey("rentedItems") as! NSData
let itemArray = NSKeyedUnarchiver.unarchiveObjectWithData(decoded) as! [Item]

答案 1 :(得分:1)

您无法直接修改默认值中的数组。而是制作副本,并修改它。您可以在之后将该阵列保存为默认值。只需尝试这样:

var array = prefs.arrayForKey("rentedItems")?.mutableCopy
array.append(item)