objective-c字典访问属性/方法

noa*_*mtm 2 reflection dictionary properties dynamic objective-c

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

NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:
    @"value1", @"key1", @"value2", @"key2", nil];
MyClass* obj = [[MyClass alloc] initWithDictionary:dict];
Run Code Online (Sandbox Code Playgroud)

现在,而不是做:

NSString* val1 = [obj value:@"key1"];
Run Code Online (Sandbox Code Playgroud)

我想要做:

NSString* val1 = [obj key1];  // @"value1"
NSString* val2 = [obj key2];  // @"value2"
NSString* val3 = [obj key3]; // nil, not found
Run Code Online (Sandbox Code Playgroud)

可能吗?

当然这假定(a)字典键是有效的标识符名称; (b)没有具有相同名称的"真实"属性/方法(这可能会改为称为真实方法).

Abi*_*ern 5

NSKeyValueCoding是一种支持键值编码的非正式协议.它是基金会的一部分,所以它已经可供您使用.

valueForUndefinedKey当您尝试以KVC方式访问某些没有属性或KVC兼容访问器的内容时​​,您可以尝试覆盖调用的内容.然后,在overriden方法中,您只需将键的值传递给字典:

- (id) valueForUndefinedKey: (NSString*)aKey {
    return [obj objectForKey:aKey];
}
Run Code Online (Sandbox Code Playgroud)

在那里坚持一些错误检查,你应该好好去.

现在你打电话的时候:

NSString *theKey = @"Key1";
NSString *val1 = [obj theKey];
Run Code Online (Sandbox Code Playgroud)

如果没有被调用的属性,Key1并且没有方法返回一个被Key1调用的对象,它将调用valueForUndefinedKey:theKey哪个将调用你的字典中的分配给键@"Key1"的对象.