可可中不区分大小写的KVC?

Eig*_*ght 6 cocoa key-value-observing key-value-coding

我很欣赏一些关于我正在考虑使用的特定方法的反馈.场景如下.

我有一个对象(让我们称之为MObject),它有许多属性,比如x和y坐标,高度和宽度.属性根据KVC指南(MObject.x; MObject.height等)命名.我的下一个任务是读入描述此MObject的XML文件.不幸的是,XML元素的命名方式不同 - X和Y,高度和宽度(注意大小写).

理想情况下,XML元素将与MObject的属性匹配.在这种情况下,我可以使用KVC并避免一大堆代码:

for (xmlProperty in xmlElement)
{
    [MObject setValue:xmlProperty.value forKey:xmlProperty.name].
}
Run Code Online (Sandbox Code Playgroud)

解决这个问题的一种方法是使用不区分大小写的键.我从哪里开始呢?还有其他更好的解决方案吗?

建议非常感谢.

Chr*_*son 3

如果你能帮助的话,不要覆盖-[NSObject valueForKey:]它。-[NSObject setValue:forKey:]

最好的选择是即时转换从 XML 文件获得的密钥。使用单独的方法进行转换,您还可以维护名称到属性键的缓存,因此每个转换只需执行一次。

- (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]].
    }
}
Run Code Online (Sandbox Code Playgroud)