gpt4 book ai didi

ios - 如何遍历 NSDictionaries 和 NSArrays 的嵌套层次结构并将其全部转换为可变副本?

转载 作者:可可西里 更新时间:2023-11-01 03:05:17 26 4
gpt4 key购买 nike

我有一个 NSDictionary,它包含许多不同类型对象的实例(NSArraysNSDictionariesNSStringsNSNumbers 等)。许多 NSDictionariesNSStrings 都有自己的嵌套 NSDictionariesNSArrays

我如何从上到下遍历整个层次结构,并将 NSDictionariesNSArrays 的所有实例转换为 NSMutableDictionariesNSMutableArrays,分别是?

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

最佳答案

以下方法创建嵌套数组、字典和集合的嵌套(深)可变副本。它还可用于在层次结构内创建非集合对象的可变副本,例如字符串。

@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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com