替换数组中字典中的对象
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 反序列化生成的结构是不可变类型的。这正是您的错误消息所告诉的内容。
【讨论】:
以上是关于替换数组中字典中的对象的主要内容,如果未能解决你的问题,请参考以下文章