iOS数组包括里面的字典全可变拷贝

需求:当接口来的数据源数组里有字典,需要全可变拷贝。

因为oc的特殊性,所以这个小工具还是需要的。

解决思路:
将一个不可变集合转为可变,可以使用系统的mutableCopy方法,但这样只是第一层可变,如果数组或字典有多层时,我们去修改值深层次的值时,会发生崩溃,这样不能达到需求,可以给数组和字典添加分类来实现这个功能。

1.添加分类.h文件如下

#import <Foundation/Foundation.h>
@interface NSArray (Catetory)
-(NSMutableArray *)mutableArrayDeeoCopy;
@end

@interface NSDictionary (Catetory)
-(NSMutableDictionary *)mutableDicDeepCopy;
@end

.m文件如下

#import "NSArray+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)
    {
        //循环读取复制每一个元素
        id value=[self objectForKey:key];
        id copyValue;
        
        // 如果是字典,递归调用
        if ([value isKindOfClass:[NSDictionary class]]) {
            
            copyValue=[value mutableDicDeepCopy];
            
            //如果是数组,数组数组深拷贝
        }else if([value isKindOfClass:[NSArray class]])
            
        {
            copyValue=[value mutableArrayDeeoCopy];
        }else{
            
            copyValue = value;
        }
        
        [dict setObject:copyValue forKey:key];
        
    }
    return dict;
    
}

@end

当在其他文件调用时:只要导入头文件
#import "NSArray+MutableCopyCatetory.h"
在需要用的位置

    NSArray *arr = @[
                   @{@"age":@"1",@"name":@"11"}
                   ,@{@"age":@"2",@"name":@"22"}
                   ];
    NSMutableArray *muArr = [NSMutableArray array];
    muArr = [arr mutableArrayDeeoCopy];
    muArr[gouBtn.tag][@"age"] = @"9";

,字典调用mutableDicDeepCopy,字典中所有value(数组或者字典)无论多少层都是可变的,数组调用mutableArrayDeeoCopy,数组中所有的元素(数组或者字典) 无论多少层也是可变的,可以直接取修改字典或数组中元素的值。
end.

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,144评论 1 32
  • 1.设计模式是什么? 你知道哪些设计模式,并简要叙述?设计模式是一种编码经验,就是用比较成熟的逻辑去处理某一种类型...
    龍飝阅读 2,194评论 0 12
  •   在iOS开发过程中,我们有时候会有这样的需求,将一个 不可变的字典或者数组转换为可变的,可以使用系统的muta...
    hhhhhhhhhh1655阅读 1,826评论 4 2
  • 1.设计模式是什么? 你知道哪些设计模式,并简要叙述? 设计模式是一种编码经验,就是用比较成熟的逻辑去处理某一种类...
    司马DE晴空阅读 1,327评论 0 7
  • 不知道怎么的好像失眠了,不像以前那样最差的样子是做了个梦惊醒了。 这是真的失眠了,睡不着的那种,总觉得有这一股闷气...
    Hi别说话我吻你阅读 258评论 0 0