#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface NSDictionary (MutableDeepCopy)
-(NSMutableDictionary *)wyMutableDeepCopy;
@end
@interface NSArray (MutableDeepCopy)
-(NSMutableArray *)wyMutableDeepCopy;
@end
@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]];
[self enumerateKeysAndObjectsUsingBlock:^(id _Nonnull key, id _Nonnull obj, BOOL * _Nonnull stop) {
id copyValue = nil;
if ([obj respondsToSelector:@selector(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]];
[self enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
id copyValue= nil;
if ([obj respondsToSelector:@selector(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];
}
}];
return array;
}
@end
@implementation NSSet (MutableDeepCopy)
-(NSMutableSet *)wyMutableDeepCopy
{
NSMutableSet *set = [[NSMutableSet alloc] initWithCapacity:[self count]];
[self enumerateObjectsUsingBlock:^(id _Nonnull obj, BOOL * _Nonnull stop) {
id copyValue;
if ([obj respondsToSelector:@selector(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