Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Case-insensitive KVC in Cocoa? [closed]

I'd appreciate some feedback on a particular approach I'm thinking of using. The scenario is below.

I have an object (lets call it MObject) that has a number of properties, say, x and y coordinates, height and width. The properties are named according to the KVC guidelines (MObject.x; MObject.height, etc). My next task, is to read in an XML file that describes this MObject. Unfortunately, the XML elements are named differently -- X and Y, Height and Width (note the capitalization).

Ideally, the XML elements would match up with MObject's properties. In this case, I could use KVC and avoid a whole whack of code:

for (xmlProperty in xmlElement)
{
    [MObject setValue:xmlProperty.value forKey:xmlProperty.name].
}

One way of approaching this would be to make use of case-insensitive keys. Where would I start with that? Are there any other, better solutions?

Suggestions very much appreciated.

like image 610
EightyEight Avatar asked Dec 02 '08 23:12

EightyEight


4 Answers

Don't override -[NSObject valueForKey:] and -[NSObject setValue:forKey:] if you can at all help it.

Your best bet would be to convert the keys you get from the XML file on the fly. Use a separate method to do the conversion and you can also maintain a cache of names to property keys, so you only need to do each conversion once.

- (NSString *)keyForName:(NSString *)name {
    // _nameToKeyCache is an NSMutableDictionary that caches the key
    // generated for a given name so it's only generated once per name
    NSString *key = [_nameToKeyCache objectForKey:name];
    if (key == nil) {
        // ...generate key...
        [_nameToKeyCache setObject:key forKey:name];
    }
    return key;
}

- (void)foo:xmlElement {
    for (xmlProperty in xmlElement) {
        [myObject setValue:xmlProperty.value forKey:[self keyForName:xmlProperty.name]].
    }
}
like image 156
Chris Hanson Avatar answered Oct 16 '22 16:10

Chris Hanson


You can use NSString's lowercaseString to convert the XML key name to lowercase, if that helps.

like image 42
Marc Charbonneau Avatar answered Oct 16 '22 15:10

Marc Charbonneau


Override -valueForUndefinedKey: and -setValue:forUndefinedKey:

If you find a key with a different capitalization use it, otherwise call up to super.

like image 3
Ashley Clark Avatar answered Oct 16 '22 16:10

Ashley Clark


Override -valueForKey: and -setValue:forKey:.

You should probably only accept keys (element/attribute names) you recognize, and call up to super for other keys.

like image 1
Peter Hosey Avatar answered Oct 16 '22 16:10

Peter Hosey