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

时间:2012-11-22 04:16:49

标签: objective-c ios nsdictionary immutability

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

例如,我有一个字典,“key1”的值是一个数组,在数组内部,每个元素都是一个字典,在每个字典中,键值为“key2”,现在我想要更改“key2”的值,因为整个数据结构是不可变的,这使得它很难,我应该使用可变集合复制这个数据结构,以便我可以更改该值,这似乎有很多开销,但这是进入我脑海的唯一方式。

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:0)

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

这取决于您是否希望在更改后仍然具有不可变结构,或者如果它在它之后仍然可变则无关紧要。

如果你想在改变后保持不变,那么你将不得不使用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中检索它时,你必须使它变得可变,并使它永久可变。

我希望它对你有所帮助。