Swift NSMutableDictionary removeobject

时间:2015-04-16 03:59:51

标签: ios swift nsmutabledictionary

我有一个像我这样发起的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'

如果您可以帮我找到错误或删除对象的方法并将其移到字典中,我们将不胜感激。

2 个答案:

答案 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)