如果我有一个具有嵌套层次结构的不可变 NSDictionary,来自 JSON 字符串,那么更改深度嵌套在层次结构中的键的值的最简单方法是什么?
比如我有一个字典,“key1”的值是一个数组,在数组里面,每个元素都是一个字典,每个字典里面都有一个key“key2”的值,现在我想改变“key2”的值,因为整个数据结构是不可变的,这很困难,我是否应该用可变集合复制这个数据结构以便我可以更改该值,这似乎有很多开销,但这是唯一的我想到的方式。
如果我有一个具有嵌套层次结构的不可变 NSDictionary,来自 JSON 字符串,那么更改深度嵌套在层次结构中的键的值的最简单方法是什么?
比如我有一个字典,“key1”的值是一个数组,在数组里面,每个元素都是一个字典,每个字典里面都有一个key“key2”的值,现在我想改变“key2”的值,因为整个数据结构是不可变的,这很困难,我是否应该用可变集合复制这个数据结构以便我可以更改该值,这似乎有很多开销,但这是唯一的我想到的方式。
我不知道这是否是您可以接受的替代方案,但您可以使用选项从 JSON 字符串创建字典,该NSJSONReadingMutableContainers
选项将所有数组和字典创建为可变对象。
我不完全确定,但我认为你必须将你的字典和数组中的每个人都传递给一个可变的。
这取决于您是否希望在更改之后仍然具有不可变结构,或者在更改之后它是否仍然可变并不重要。
如果您想在更改后保持不可变,那么您必须将 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 中检索它时使其可变,并使其永久可变。
我希望它对你有帮助。