Доступ к словарю объекта C в качестве свойства / метода - PullRequest
2 голосов
/ 24 декабря 2011

В моем классе 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

Возможно ли это?

Конечно, это предполагает, что (а) ключи словаря являются допустимыми именами идентификаторов; и (b) не существует «реальных» свойств / методов с одинаковым именем (это, вероятно, вызовет реальный метод вместо этого).

1 Ответ

5 голосов
/ 24 декабря 2011

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".

...