【问题标题】:objective-c dictionary access as property/method作为属性/方法的objective-c字典访问
【发布时间】:2012-01-27 10:07:24
【问题描述】:

在我的 obj-c 类中,我有一个将字符串映射到对象的字典。

NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:
    @"value1", @"key1", @"value2", @"key2", nil];
MyClass* obj = [[MyClass alloc] initWithDictionary:dict];

现在,不要这样做:

NSString* val1 = [obj value:@"key1"];

我想做:

NSString* val1 = [obj key1];  // @"value1"
NSString* val2 = [obj key2];  // @"value2"
NSString* val3 = [obj key3]; // nil, not found

有可能吗?

当然,这假设 (a) 字典键是有效的标识符名称; (b) 没有同名的“真实”属性/方法(这可能会调用真实方法)。

【问题讨论】:

    标签: objective-c reflection dynamic dictionary properties


    【解决方案1】:

    NSKeyValueCoding 是一个非正式的协议,可以实现键值编码。它是 Foundation 的一部分,因此您已经可以使用它。

    您可以尝试覆盖valueForUndefinedKey,当您尝试以没有属性或符合 KVC 的访问器的 KVC 方式访问某些内容时会调用它。然后,在覆盖的方法中,您可以将键的值传递给字典:

    - (id) valueForUndefinedKey: (NSString*)aKey {
        return [obj objectForKey:aKey];
    }
    

    在那里坚持一些错误检查,你应该很高兴。

    现在当你打电话时:

    NSString *theKey = @"Key1";
    NSString *val1 = [obj theKey];
    

    如果没有名为Key1 的属性并且没有返回名为Key1 的对象的方法,它将调用valueForUndefinedKey:theKey,它将调用分配给键@“Key1”的对象的字典。

    【讨论】:

    • 您的回答很准确,尽管我有点担心为什么 OP 觉得有必要做这样的事情。一般来说,如果不会产生一些真正令人信服的好处,最好谨慎地将这种魔法引入代码库。
    • @jlehr:我正在寻找类似 Javascript 的字典访问。我确实有这样做的理由。
    • @Abizern:这几乎是我想要的。在上面的示例中,我希望能够调用 [obj Key1],而不是 [obj @"Key1"]。
    • @noamtm 原因是……?
    猜你喜欢
    • 1970-01-01
    • 2012-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-09
    相关资源
    最近更新 更多