容器深拷贝

#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

//字典里的所有Value都至少要实现NSCopy协议的深拷贝(特别是自定义的类)
@interface NSDictionary (MutableDeepCopy)

-(NSMutableDictionary *)wyMutableDeepCopy;

@end

//所有的元素都至少要实现NSCopy协议的深拷贝(特别是自定义的类)
@interface NSArray (MutableDeepCopy)

-(NSMutableArray *)wyMutableDeepCopy;

@end

//所有的元素都至少要实现NSCopy协议的深拷贝(特别是自定义的类)
@interface NSSet (MutableDeepCopy)

-(NSMutableArray *)wyMutableDeepCopy;

@end

NS_ASSUME_NONNULL_END


#import "WYCollectionMutableDeepCopy.h"

@implementation NSDictionary (MutableDeepCopy)
-(NSMutableDictionary *)wyMutableDeepCopy
{
    NSMutableDictionary *dict = [[NSMutableDictionary alloc] initWithCapacity:[self count]];
    //新建一个NSMutableDictionary对象,大小为原NSDictionary对象的大小
    [self enumerateKeysAndObjectsUsingBlock:^(id  _Nonnull key, id  _Nonnull obj, BOOL * _Nonnull stop) {
        id copyValue = nil;
        if ([obj respondsToSelector:@selector(wyMutableDeepCopy)])
        {
            //如果key对应的元素可以响应wyMutableDeepCopy方法(还是NSDictionary),调用wyMutableDeepCopy方法复制
            copyValue = [obj performSelector:@selector(wyMutableDeepCopy)];
        }
        else if ([obj conformsToProtocol:@protocol(NSMutableCopying)] &&
                 [obj respondsToSelector:@selector(mutableCopyWithZone:)])
        {
            copyValue = [obj mutableCopy];
        }
        else if ([obj conformsToProtocol:@protocol(NSCopying)] &&
                 [obj respondsToSelector:@selector(copyWithZone:)])
        {
            copyValue = [obj copy];//
        }
        if (copyValue)
        {
            [dict setObject:copyValue forKey:key];
        }
        else
        {
            [dict setObject:obj forKey:key];
            NSAssert2(NO, @"NSDictionary (MutableDeepCopy) dict:%@ errorKey:%@",self , key);
        }
    }];
    return dict;
}
@end

@implementation NSArray (MutableDeepCopy)
-(NSMutableArray *)wyMutableDeepCopy
{
    NSMutableArray *array = [[NSMutableArray alloc] initWithCapacity:[self count]];
    //新建一个NSMutableArray对象,大小为原NSArray对象的大小
    [self enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        id copyValue= nil;
        if ([obj respondsToSelector:@selector(wyMutableDeepCopy)])
        {
            //如果item可以响应wyMutableDeepCopy方法(还是NSDictionary),调用wyMutableDeepCopy方法复制
            copyValue = [obj performSelector:@selector(wyMutableDeepCopy)];
        }
        else if ([obj conformsToProtocol:@protocol(NSMutableCopying)] &&
                 [obj respondsToSelector:@selector(mutableCopyWithZone:)])
        {
            copyValue = [obj mutableCopy];
        }
        else if ([obj conformsToProtocol:@protocol(NSCopying)] &&
                 [obj respondsToSelector:@selector(copyWithZone:)])
        {
            copyValue = [obj copy];
        }
        if (copyValue)
        {
            [array addObject:copyValue];
        }
        else
        {
            [array addObject:obj];
            //NSAssert3(NO, @"NSArray (MutableDeepCopy) array:%@ errorItem:%@ index:%lu",self , obj, (unsigned long)idx);
        }
    }];
    return array;
}
@end

@implementation NSSet (MutableDeepCopy)
-(NSMutableSet *)wyMutableDeepCopy
{
    NSMutableSet *set = [[NSMutableSet alloc] initWithCapacity:[self count]];
    //新建一个NSMutableArray对象,大小为原NSArray对象的大小
    [self enumerateObjectsUsingBlock:^(id  _Nonnull obj, BOOL * _Nonnull stop) {
        id copyValue;
        if ([obj respondsToSelector:@selector(wyMutableDeepCopy)])
        {
            //如果item可以响应wyMutableDeepCopy方法(还是NSDictionary),调用wyMutableDeepCopy方法复制
            copyValue = [obj performSelector:@selector(wyMutableDeepCopy)];
        }
        else if ([obj conformsToProtocol:@protocol(NSMutableCopying)] &&
                 [obj respondsToSelector:@selector(mutableCopyWithZone:)])
        {
            copyValue = [obj mutableCopy];
        }
        else if ([obj conformsToProtocol:@protocol(NSCopying)] &&
                 [obj respondsToSelector:@selector(copyWithZone:)])
        {
            copyValue = [obj copy];
        }
        if (copyValue)
        {
            [set addObject:copyValue];
        }
        else
        {
            [set addObject:obj];
            NSAssert2(NO, @"NSSet (MutableDeepCopy) set:%@ errorItem:%@",self , obj);
        }
    }];
    return set;
}
@end

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值