具有深度嵌套层次结构的不可变 NSDictionary:更改键的值?

Posted

技术标签:

【中文标题】具有深度嵌套层次结构的不可变 NSDictionary:更改键的值?【英文标题】:Immutable NSDictionary with deeply nested hierarchy: change a value for a key? 【发布时间】:2012-11-22 04:16:48 【问题描述】:

如果我有一个具有嵌套层次结构的不可变 NSDictionary,从 JSON 字符串,更改深度嵌套在层次结构中的键的值的最简单方法是什么?

例如,我有一个字典,“key1”的值是一个数组,在数组里面,每个元素都是一个字典,每个字典里面都有一个key“key2”的值,现在我想要要更改“key2”的值,因为整个数据结构是不可变的,这很困难,我是否应该使用可变集合复制这个数据结构以便我可以更改该值,这似乎有很多开销,但是这个是我想到的唯一方法。

【问题讨论】:

您是否尝试单独键入特定的字典,然后更改 key2 的值​​? @ACB 然后我需要将其所有超级字典/数组转换为可变的,所以如果我有["key1":("key2":"value2"...)] 那么为了将"key2":"value2" 转换为可变,我还需要对其进行大小写上层字典是可变的 我认为没有必要。如果你只是尝试单独做这件事会发生什么?你检查了吗? @ACB 我可以尝试,但是如何将不可变字典转换为可变字典?使用[NSMutableDictionary initWithDictionary:]?然后它将复制原始字典中的所有键/值,这样即使我更改可变字典中的值,原始字典也不会更改。 @ACB 如果是NSDictionary,你怎么能把它转换成NSMutableDictionary 【参考方案1】:

我不知道这是否是您可以接受的替代方案,但您可以使用 NSJSONReadingMutableContainers 选项从 JSON 字符串创建字典,该选项将所有数组和字典创建为可变对象。

【讨论】:

【参考方案2】:

我不完全确定,但我认为你必须将你的字典和数组中的每个人都传递给一个可变的。

这取决于您是否希望在更改后仍然具有不可变结构,或者在更改之后它是否仍然可变并不重要。

如果您想在更改后保持不可变,那么您必须将 temp 变量用于可变 dict 和数组。

NSMutableDictionary *rootDict = [NSMutableDictionary dictionaryWithDictionary:rootImmutableDict];

NSMutableArray* mutableArray = [NSMutableArray arrayWithArray:[rootImmutableDict objectForKey:@"key1"]];

NSMutableDictionary* valueDict = [NSMutableDictionart dictionaryWithDictionary:[mutableArray objectAtIndex:idx]];

[valueDict setObject:newValueObject forKey:@"key2"];

[rootImmutableDict release];
rootImmutableDict = nil;
rootImmutableDict = [[NSDictionary alloc] initWithDictionary:rootDict];

如果它是否可变对您来说并不重要,那么您必须在使用临时不可变结构从 JSON 中检索它时使其可变,并使其永久可变。

希望对你有帮助。

【讨论】:

实际上我需要一种方法来处理任何深度,示例一个只有两个,但看起来我需要制作一个我需要更改为可变的超级集合,所以我'会选择你的答案。 Martin R 的回答比这个简单得多。

以上是关于具有深度嵌套层次结构的不可变 NSDictionary:更改键的值?的主要内容,如果未能解决你的问题,请参考以下文章

直接从任何地方呈现深度嵌套的视图控制器,同时保留层次结构

Sean Parent:对于继承层次结构中的多态类型,具有可变对象是极端的例外

ReactJS 控制组件和不可变数据

多层次查询深度嵌套复杂的 JSON 数据

按层次结构和名称对具有层次结构的对象数组进行排序

如何在 Xcode 视图层次结构中拥有深度视图?