??在iOS開發(fā)過(guò)程中砚婆,我們有時(shí)候會(huì)有這樣的需求突勇,將一個(gè) 不可變的字典或者數(shù)組轉(zhuǎn)換為可變的,可以使用系統(tǒng)的mutableCopy方法验夯,但是這樣只是第一層可變摔刁,如果數(shù)組或字典有多層時(shí),我們?nèi)バ薷闹瞪顚哟蔚闹禃r(shí)绑谣,會(huì)發(fā)生崩潰,這樣并不能達(dá)到預(yù)期的要求幌衣,可以給數(shù)組和字典添加分類來(lái)實(shí)現(xiàn)這個(gè)功能壤玫。
可以自己定義一個(gè)文件
.h 文件中
#import <Foundation/Foundation.h>
@interface NSArray (Catetory)
-(NSMutableArray *)mutableArrayDeeoCopy;
@end
@interface NSDictionary (Catetory)
-(NSMutableDictionary *)mutableDicDeepCopy;
@end
.m 文件中
#import "MutableCopyCatetory.h"
@implementation NSArray (Catetory)
-(NSMutableArray *)mutableArrayDeeoCopy{
NSMutableArray * array = [NSMutableArray array];
[self enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
id objOject;
if ([obj isKindOfClass:[NSDictionary class]]) {
objOject = [obj mutableDicDeepCopy];
}else if ([obj isKindOfClass:[NSArray class]]){
objOject = [obj mutableArrayDeeoCopy];
}else{
objOject = obj;
}
[array addObject:objOject];
}];
return array;
}
@end
@implementation NSDictionary (Catetory)
-(NSMutableDictionary *)mutableDicDeepCopy{
NSMutableDictionary *dict=[[NSMutableDictionary alloc] initWithCapacity:[self count]];
NSArray *keys=[self allKeys];
for(id key in keys)
{
//循環(huán)讀取復(fù)制每一個(gè)元素
id value=[self objectForKey:key];
id copyValue;
// 如果是字典欲间,遞歸調(diào)用
if ([value isKindOfClass:[NSDictionary class]]) {
copyValue=[value mutableDicDeepCopy];
//如果是數(shù)組,數(shù)組數(shù)組深拷貝
}else if([value isKindOfClass:[NSArray class]])
{
copyValue=[value mutableArrayDeeoCopy];
}else{
copyValue = value;
}
[dict setObject:copyValue forKey:key];
}
return dict;
}
@end
只要導(dǎo)入頭文件班缎,字典調(diào)用mutableDicDeepCopy达址,字典中所有value(數(shù)組或者字典)無(wú)論多少層都是可變的趁耗,數(shù)組調(diào)用mutableArrayDeeoCopy,數(shù)組中所有的元素(數(shù)組或者字典) 無(wú)論多少層也是可變的右冻,可以直接取修改字典或數(shù)組中元素的值著拭。