替换数组中字典中的对象

Posted

技术标签:

【中文标题】替换数组中字典中的对象【英文标题】:Replacing Object in Dictionary in an Array 【发布时间】:2014-04-01 21:18:30 【问题描述】:

我有一个数组结构如下:

NSMutableArray topArray
    NSMutableArray middleArray
        NSMutableArray lowerArray
            NSMutableDictionary dict
            
        
    

数组结构中填充了一些我从网上检索到的数据是 JSON 格式。

我正在尝试编辑 NSMutableDictionary 中的一个对象,如下所示:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

    NSMutableArray *lowerArray = [[self middleArray] objectAtIndex:[indexPath section]];
    NSMutableDictionary *dict = [lowerArray objectAtIndex:[indexPath row]];

    [dict setObject:[NSNumber numberWithInt:1] forKey:@"key"];

    [[self tableView] reloadData];

每个数组中的数据都是正确的(我已经检查了打印语句),但是,当我尝试更改 dict 中的对象时,我收到以下错误: 原因:

'-[__NSCFDictionary setObject:forKey:]: 变异方法发送到 不可变对象'

我需要在数组结构中更改字典中的对象。

这可能是 JSON 数据的问题吗,因为当 topArray 首次使用 JSON 数据初始化时,中间和较低的数组只是 NSArray 的形式?

抱歉,如果这令人困惑,如果您有任何问题,我会尽力澄清。

提前感谢您的帮助。

【问题讨论】:

你是如何初始化数据结构的? 如果您从 NSJSONSerialization 获取 JSON,则可以选择让它返回可变对象。打开该选项,您的问题应该就解决了。 注意,仅仅因为一个指针被声明为 NSMutableDictionary 并不意味着它指向的对象是可变的,甚至是一个字典。 【参考方案1】:

如果您使用NSJSONSerialization,则可以将NSJSONReadingMutableContainers 传递给+JSONObjectWithData:options:error:options 参数,所有已解析的字典和数组都是可变的。

NSMutableArray *topArray = [NSJSONSerialization JSONObjectWithData:webServiceData 
                                                           options:NSJSONReadingMutableContainers 
                                                             error:nil];

【讨论】:

【参考方案2】:

对于moduleDict 变量,只需使用NSMutableDictionary 类而不是NSDictionary。在解析 JSON 对象时很容易做到。如果没有 - 创建一个这样的:

NSMutableDictionary *newDict = [NSMutableDictionary dictionaryWithDictionary: moduleDict];

【讨论】:

问题是他的字典在一个几乎可以肯定是不可变的数组中。所以他不能在不复制所有内容的情况下更新他的结构。最好使用 NSJSONSerialization 选项。【参考方案3】:

我怀疑您是否真的在最低级别处理 NSMutableDictionary。你有这些打印语句的输出给我们吗?

通常由 JSON 反序列化生成的结构是不可变类型的。这正是您的错误消息所告诉的内容。

【讨论】:

以上是关于替换数组中字典中的对象的主要内容,如果未能解决你的问题,请参考以下文章

用空字符串替换字典数组中的 NSNull 值

Numpy:使用字典作为地图有效地替换二维数组中的值

iOS开发,如何替换plist这个数组下数据

将 SWIFT 字典替换为 JSON 对象

查找和替换数组中的对象(基于 id)

在Javascript中替换嵌套对象中的数组