我有一个像我这样发起的NSMutableDictionary
var data = NSMutableDictionary()
稍后我试图删除该值,因为我想将每个值向上移动一个键。这是我正在做的代码
let buttonRow = sender.tag
let setCount = buttonRow + 1
var keyedPath: String = NSString(format: "Set%d", setCount) as String
let value: AnyObject? = data.valueForKey(keyedPath)
var goodSetsCount: String = NSString(format: "Set%d", goodSets.count) as String
goodSets.setValue(value, forKey: goodSetsCount)
//data.setValue("Hello", forKey: keyedPath)
//data.removeObjectForKey(keyedPath)
在两条已注释掉的行中,我收到此错误
*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '-[__NSCFDictionary setObject:forKey:]: mutating method sent to immutable object'
如果您可以帮我找到错误或删除对象的方法并将其移到字典中,我们将不胜感激。
答案 0 :(得分:1)
默认情况下,NSJSONSerialization.JSONObjectWithData
返回不可变容器。您需要指定选项NSJSONReadingOptions.MutableContainers
才能检索可变容器。事实上,在Swift 1.2中您的任务
data = NSJSONSerialization.JSONObjectWithData(returnData, options: nil, error: &jsonError) as! NSMutableDictionary
应该抛出一个运行时异常,因为你使用强制向下转换到NSMutableDictionary会失败,虽然我不确定这是否是用Cocoa类强制执行的。
如果您将行更改为
data = NSJSONSerialization.JSONObjectWithData(returnData, options: .MutableContainers, error: &jsonError) as! NSMutableDictionary
您的代码应该有效。
答案 1 :(得分:0)
正如@ Pauwlw11所示,您正在尝试修改不可变的字典对象。除此之外,如果你使用Swift结构而不是简单地从Objective-C翻译它,你的代码就可以清楚了。
var data = NSJSONSerialization.JSONObjectWithData(returnData, options: NSJSONReadingOptions.MutableContainers, error: &jsonError) as NSMutableDictionary
在按钮单击处理程序中:
let setCount = 1
var keyedPath = "Set\(setCount)"
let value = data[keyedPath]
var goodSetsCount = "Set\(setCount)"
data[keyedPath] = "Hello"
data.removeObjectForKey(keyedPath)