美文网首页
iOS 中数组和字典的可变拷贝

iOS 中数组和字典的可变拷贝

作者: hhhhhhhhhh1655 | 来源:发表于2017-11-01 15:01 被阅读266次

      在iOS开发过程中,我们有时候会有这样的需求,将一个 不可变的字典或者数组转换为可变的,可以使用系统的mutableCopy方法,但是这样只是第一层可变,如果数组或字典有多层时,我们去修改值深层次的值时,会发生崩溃,这样并不能达到预期的要求,可以给数组和字典添加分类来实现这个功能。

    可以自己定义一个文件

    .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)
        {
        //循环读取复制每一个元素
            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
    
    
    
    

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

    相关文章

      网友评论

          本文标题:iOS 中数组和字典的可变拷贝

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