Search code examples
iosobjective-cnsdictionarykey-value-coding

Generate a complete list of key-value coding paths for nested NSDictionary's?


I have an NSDictionary that contains keys and values, and some values will also be NSDictionarys... to an arbitrary (but reasonable) level.

I would like to get a list of all valid KVC paths, e.g. given:

{
    "foo" = "bar",
    "qux" = {
        "taco" = "delicious",
        "burrito" = "also delicious",
    }
}

I would get:

[
    "foo",
    "qux",
    "qux.taco",
    "qux.burrito"
]

Is there a simple way to do this that already exists?


Solution

  • You could recurse through allKeys. A key is a key path, obviously, and then if the value is an NSDictionary you can recurse and append.

    - (void) obtainKeyPaths:(id)val intoArray:(NSMutableArray*)arr withString:(NSString*)s {
        if ([val isKindOfClass:[NSDictionary class]]) {
            for (id aKey in [val allKeys]) {
                NSString* path = 
                    (!s ? aKey : [NSString stringWithFormat:@"%@.%@", s, aKey]);
                [arr addObject: path];
                [self obtainKeyPaths: [val objectForKey:aKey] 
                           intoArray: arr 
                          withString: path];
            }
        }
    }
    

    And here is how to call it:

    NSMutableArray* arr = [NSMutableArray array];
    [self obtainKeyPaths:d intoArray:arr withString:nil];
    

    Afterwards, arr contains your list of key paths.