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

Can't modify array stored in NSUserDefaults

在 class FirstViewController 中,我在以下行中向 NSUserDefaults 添加了一个键为 rentedItems 的数组:

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

然后,在另一个 class 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 中看到了一个解决方案,它让我了解了这个问题,但是 NSUserDefaults 是默认值 iOS class,我不能使用与那里相同的解决方案。有什么想法吗?

您需要将您的自定义对象数组存档到 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]

您不能直接修改默认数组。而是复制并修改它。之后您可以将该数组保存为默认值。只需像这样尝试:

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