2011-12-24 42 views
2

在我的obj-c类中,我有一个将字符串映射到对象的字典。作为属性/方法的objective-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)没有“真正的”属性/方法具有相同的名称(这可能会调用真正的方法)。

回答

5

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”。

+0

你的答案是点睛之笔,虽然我会有点担心OP为什么需要做这样的事情。总的来说,如果它不会产生真正令人信服的好处,那么将这种魔法引入代码库似乎最好是谨慎的。 – jlehr 2011-12-24 20:42:36

+0

@jlehr:我正在寻找类似Javascript的字典访问。我确实有一个理由。 – noamtm 2011-12-25 09:10:20

+0

@Abizern:这*几乎*我想要的。在你上面的例子中,我希望能够调用[obj Key1],而不是[obj @“Key1”]。 – noamtm 2011-12-25 09:20:24