具有深度嵌套层次结构的不可变 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:更改键的值?的主要内容,如果未能解决你的问题,请参考以下文章