NSDictionaryをコピーする場合、配列がディクショナリに入っていると、単なるミュータブルコピーでは値がコピーされません。そこでディープコピーとして全ての値をコピーすることになるそうです。
そのコードが以下になります。2番目のミュータブルコピーをしているのは、ディクショナリの場合は1番目のディーブコピーをするからで、残りが配列のみになるからでしょう。ただし、現在ディープコピーをサポートしているのは、ディクショナリだけですから、ディクショナリと配列以外の型がある場合は、もう少しコーディングする必要がある、ということかもしれません。難しい...
#import "NSDictionary-MutableDeepCopy.h"
@implementation NSDictionary(MutableDeepCopy)
-(NSMutableDictionary *)mutableDeepCopy
{
NSMutableDictionary *ret = [[NSMutableDictionary alloc] initWithCapacity:[self count]];
NSArray *keys = [self allKeys];
for (id key in keys)
{
id oneValue = [self valueForKey:key];
id oneCopy = nil;
if ([oneValue respondsToSelector:@selector(mutableDeepCopy)])
oneCopy = [oneValue mutableDeepCopy];
else if ([oneValue respondsToSelector:@selector(mutableCopy)])
oneCopy = [oneValue mutableCopy];
if (oneCopy == nil)
oneCopy = [oneValue copy];
[ret setValue:oneCopy forKey:key];
}
return ret;
}
@end
0 件のコメント:
コメントを投稿