无法修改存储在 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)
在 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
您需要将您的自定义对象数组存档到 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)