深度结合NSDictionaries

Ale*_*ers 15 merge objective-c nsdictionary

我需要将两个NSDictionarys 合并为一个,前提是如果字典中有字典,它们也会合并.

或多或少像jQuery的extend功能.

Ale*_*ers 30

的NSDictionary + Merge.h

#import <Foundation/Foundation.h>

@interface NSDictionary (Merge)

+ (NSDictionary *) dictionaryByMerging: (NSDictionary *) dict1 with: (NSDictionary *) dict2;
- (NSDictionary *) dictionaryByMergingWith: (NSDictionary *) dict;

@end
Run Code Online (Sandbox Code Playgroud)

的NSDictionary + Merge.m

#import "NSDictionary+Merge.h"

@implementation NSDictionary (Merge)

+ (NSDictionary *) dictionaryByMerging: (NSDictionary *) dict1 with: (NSDictionary *) dict2 {
    NSMutableDictionary * result = [NSMutableDictionary dictionaryWithDictionary:dict1];

[dict2 enumerateKeysAndObjectsUsingBlock: ^(id key, id obj, BOOL *stop) {
    if (![dict1 objectForKey:key]) {
        if ([obj isKindOfClass:[NSDictionary class]]) {
            NSDictionary * newVal = [[dict1 objectForKey: key] dictionaryByMergingWith: (NSDictionary *) obj];
            [result setObject: newVal forKey: key];
        } else {
            [result setObject: obj forKey: key];
        }
    }
}];

    return (NSDictionary *) [[result mutableCopy] autorelease];
}
- (NSDictionary *) dictionaryByMergingWith: (NSDictionary *) dict {
    return [[self class] dictionaryByMerging: self with: dict];
}

@end
Run Code Online (Sandbox Code Playgroud)


Jac*_*kin 7

我想这就是你要找的东西:

首先,您需要制作一个深度可变副本,因此您可以创建一个类别NSDictionary来执行此操作:

@implementation NSDictionary (DeepCopy)

- (id)deepMutableCopy
{
    id copy(id obj) {
        id temp = [obj mutableCopy];
        if ([temp isKindOfClass:[NSArray class]]) {
            for (int i = 0 ; i < [temp count]; i++) {
               id copied = [copy([temp objectAtIndex:i]) autorelease];
               [temp replaceObjectAtIndex:i withObject:copied];
            }
        } else if ([temp isKindOfClass:[NSDictionary class]]) {
            NSEnumerator *enumerator = [temp keyEnumerator];
            NSString *nextKey;
            while (nextKey = [enumerator nextObject])
                [temp setObject:[copy([temp objectForKey:nextKey]) autorelease]
                         forKey:nextKey];
        } 
        return temp;
    }

    return (copy(self));
}

@end
Run Code Online (Sandbox Code Playgroud)

然后,你可以deepMutableCopy像这样打电话:

NSMutableDictionary *someDictionary = [someDict deepMutableCopy];
[someDictionary addEntriesFromDictionary:otherDictionary];
Run Code Online (Sandbox Code Playgroud)