【问题标题】:How to get properties via name? If I have `@"color"`, how do I get `self.color`?如何通过名称获取属性?如果我有`@"color"`,我如何获得`self.color`?
【发布时间】:2013-03-21 21:33:36
【问题描述】:

我正在通过 KVO 观察一个 NSDictionary,我在其中存储我的用户偏好。

更改首选项字典后,我想将我的类的属性更新为新值。

我有许多子类,每个子类都有不同的属性。我正在寻找一种在超类中拥有一个方法的方法,该方法可以正确地为任何子类的各种属性将 NSDictionary 中的值分配给属性。

//Observe when user toggles preferences
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context 
{
    NSDictionary *prefs = [change objectForKey:NSKeyValueChangeNewKey];

    //I know I can do...
    //Subclass1
    self.isEnabled = [[prefs objectForKey:@"isEnabled"] boolValue];
    self.color = [[prefs objectForKey:@"color"];
    self.width = [[prefs objectForKey:@"width"];

    // -- or -- 

    //Subclass2
    self.isEnabled = [[prefs objectForKey:@"isEnabled"] boolValue];
    self.weight = [[prefs objectForKey:@"weight"];
    self.age = [[prefs objectForKey:@"age"];
    //...etc.

    //But I would prefer to do something like this... (Pseudocode)
    for (id key in prefs)
    {
        id value = [prefs objectForKey:key];
        [self propertyNamed:key] = value; // How can I accomplish this?
    }
}

我知道我可以将方法子类化,并让每个子类使用自定义方法处理其特定属性。我正在寻找一种方法让超类处理所有子类。

显然这里有很多情况......如果字典有一个键并且该属性在类中不存在,等等。让我们暂时忽略它。

有什么想法吗?

【问题讨论】:

  • bbum 的解决方案有什么问题你不接受它?
  • “类的属性”是什么意思?听起来您更像是在谈论实例的属性,@bbum 的答案是正确的解决方案。
  • 我以为我的解决方案有效,并接受了它....但实际上忘记了在我“手动”设置属性的地方取出代码。当我得到它的工作时,我提交了一个编辑请求,要求 bbum 的答案,因为在我看来它目前过于简洁。
  • @cksubs,也许你问他,他会把它变成小说。但实际上它完美地展示了解决方案。

标签: ios objective-c macos cocoa-touch cocoa


【解决方案1】:

NSKeyValueCoding

[self setValue:... forKey:@"color"];
color = [self valueForKey:@"color"];

【讨论】:

    猜你喜欢
    • 2013-05-29
    • 1970-01-01
    • 2013-01-02
    • 1970-01-01
    • 2010-11-15
    • 2013-02-11
    • 1970-01-01
    相关资源
    最近更新 更多