ios – 如何遍历NSDictionaries和NSArrays的嵌套层次结构并将所有转换为可变副本?

我有一个NSDictionary,包含许多不同类型对象的实例(NS Arrays,NSDictionaries,Nsstrings,NSNumbers等…).许多NSDictionaries和Nsstrings都有自己的嵌套NSDictionaries和NSArrays.

如何从上到下遍历整个层次结构,并将NSDictionaries和NSArrays的所有实例分别转换为NSMutableDictionaries和NSMutableArrays?

是否有任何简单的“递归制作可变副本”功能我不知道?如果没有,我只需要反复循环和打字检查吗?我可以随时更换,还是重建整个层次结构?

解决方法

以下方法创建嵌套数组,字典和集的嵌套(深层)可变副本.它还可用于在层次结构内创建非集合对象的可变副本,例如字符串.
@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上看过这样的东西,但现在找不到它.

相关文章

UITabBarController 是 iOS 中用于管理和显示选项卡界面的一...
UITableView的重用机制避免了频繁创建和销毁单元格的开销,使...
Objective-C中,类的实例变量(instance variables)和属性(...
从内存管理的角度来看,block可以作为方法的传入参数是因为b...
WKWebView 是 iOS 开发中用于显示网页内容的组件,它是在 iO...
OC中常用的多线程编程技术: 1. NSThread NSThread是Objecti...