我有一个NSDictionary
,其中包含许多不同类型的对象(NSArrays
,NSDictionaries
,NSStrings
,NSNumbers
等)的实例。许多NSDictionaries
和NSStrings
具有自己的嵌套NSDictionaries
和NSArrays
。
如何从头到尾遍历整个层次结构,并将NSDictionaries
和NSArrays
的所有实例分别转换为NSMutableDictionaries
和NSMutableArrays
?
我没有意识到任何简单的“递归制作可变副本”功能吗?如果没有,我是否只需要循环并重复键入check?我可以随便替换还是重新构建整个层次结构?
最佳答案
以下方法创建嵌套数组,字典和集合的嵌套(深层)可变副本。它也可以用于创建层次结构内非集合对象(例如字符串)的可变副本。
@interface NSObject (MyDeepCopy)
-(id)deepMutableCopy;
@end
@implementation NSObject (MyDeepCopy)
-(id)deepMutableCopy
{
if ([self isKindOfClass:[NSArray class]]) {
NSArray *oldArray = (NSArray *)self;
NSMutableArray *newArray = [NSMutableArray array];
for (id obj in oldArray) {
[newArray addObject:[obj deepMutableCopy]];
}
return newArray;
} else if ([self isKindOfClass:[NSDictionary class]]) {
NSDictionary *oldDict = (NSDictionary *)self;
NSMutableDictionary *newDict = [NSMutableDictionary dictionary];
for (id obj in oldDict) {
[newDict setObject:[oldDict[obj] deepMutableCopy] forKey:obj];
}
return newDict;
} else if ([self isKindOfClass:[NSSet class]]) {
NSSet *oldSet = (NSSet *)self;
NSMutableSet *newSet = [NSMutableSet set];
for (id obj in oldSet) {
[newSet addObject:[obj deepMutableCopy]];
}
return newSet;
#if MAKE_MUTABLE_COPIES_OF_NONCOLLECTION_OBJECTS
} else if ([self conformsToProtocol:@protocol(NSMutableCopying)]) {
// e.g. NSString
return [self mutableCopy];
} else if ([self conformsToProtocol:@protocol(NSCopying)]) {
// e.g. NSNumber
return [self copy];
#endif
} else {
return self;
}
}
@end
像这样使用
NSDictionary *dict = ...;
NSMutableDictionary *mdict = [dict deepMutableCopy];
(不复制字典键,仅复制值)。
我非常确定我已经在SO上看到了类似的内容,但是现在无法找到它。
关于ios - 如何遍历NSDictionaries和NSArrays的嵌套层次结构并将其全部转换为可变副本?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15587679/