2010年5月27日木曜日

MutableDeepCopy

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 件のコメント:

コメントを投稿