Search code examples
iosobjective-cnsmutabledictionarykey-value-coding

NSMutableDictionary remove object at key path?


I've got a layered NSMutableDictionary object and i'd like to be able to remove dictionaries deeper down in the hierarchy. Is there a quick and easy way to do this, for example, a removeObjectAtKeyPath-like method? Can't seem to find one.

Thanks!


Solution

  • Nothing built in, but your basic category method will do just fine:

    @implementation NSMutableDictionary (WSSNestedMutableDictionaries)
    
    - (void)WSSRemoveObjectForKeyPath: (NSString *)keyPath
    {
        // Separate the key path
        NSArray * keyPathElements = [keyPath componentsSeparatedByString:@"."];
        // Drop the last element and rejoin the path
        NSUInteger numElements = [keyPathElements count];
        NSString * keyPathHead = [[keyPathElements subarrayWithRange:(NSRange){0, numElements - 1}] componentsJoinedByString:@"."];
        // Get the mutable dictionary represented by the path minus that last element
        NSMutableDictionary * tailContainer = [self valueForKeyPath:keyPathHead];
        // Remove the object represented by the last element
        [tailContainer removeObjectForKey:[keyPathElements lastObject]];
    }
    
    @end
    

    N.B. That this requires that the second-to-last element of the path -- the tailContainer be something that responds to removeObjectForKey:, probably another NSMutableDictionary. If it's not, boom!