在班级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类,我不能使用相同的解决方案。有什么想法吗?
答案 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)