class PLCalendarEventViewController: UITableViewController {
var event: NSMutableDictionary!
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == PLCalendarEditEventLinksSegueIdentifier {
let tvc = segue.destinationViewController as PLCalendarEditEventLinksTableViewController
if var links = event.objectForKey("links") as? NSMutableArray {
tvc.data = links
}
}
}
}
但在我的PLCalendarEditEventLinksTableViewController
内,当我尝试data.addObject("new link")
时,我会收到以下错误:
mutating method sent to immutable object
。
我需要做的就是当我更改NSMutableArray
内部PLCalendarEditEventLinksTableViewController
时我在event: NSMutableDictionary
内更改PLCalendarEventViewController
class PLCalendarEditEventLinksTableViewController: UITableViewController {
var data = NSMutableArray()
}
在Objective-C中非常简单,但是如何在Swift中执行此操作?
答案 0 :(得分:1)
可以使用这个简单的脚本重现此问题:
import Foundation
let userDefault = NSUserDefaults.standardUserDefaults()
let obj: NSMutableDictionary = ["test": NSMutableArray(array: ["foo", "bar"])]
userDefault.setObject(obj, forKey: "key")
let obj2 = userDefault.objectForKey("key") as NSMutableDictionary
if let ary = obj2["test"] as? NSMutableArray {
ary.addObject("baz")
}
您可以将NSMutableArray
存储到NSUserDefaults
,但是当从中检索它时,它实际上是一个不可变数组。见the docs:
从
NSUserDefaults
返回的值是 immutable ,即使您将可变对象设置为值。
我不知道实际event
是如何构建的,但不管怎样,你必须深度复制它到可变容器。 AFAIK,最简单的方法是使用CFPropertyListCreateDeepCopy()
。在构建event
属性的位置:
event = CFPropertyListCreateDeepCopy(nil, event, CFPropertyListMutabilityOptions.MutableContainers.rawValue) as NSMutableDictionary