iOS 中不可變的字典或者數組轉換爲可變的

在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,數組中所有的元素(數組或者字典) 無論多少層也是可變的,可以直接取修改字典或數組中元素的值。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章