美文网首页
iOS数组包括里面的字典全可变拷贝

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

作者: 六两 | 来源:发表于2019-11-01 15:55 被阅读0次

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

    因为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.

    相关文章

      网友评论

          本文标题:iOS数组包括里面的字典全可变拷贝

          本文链接:https://www.haomeiwen.com/subject/gfzfbctx.html