Мнение: рамки и компоненты третьей части следует использовать только в качестве крайней меры.
Я часто вижу, как программисты сразу выбирают среду для выполнения задачи, не изучая базовый подход, который требуется для работы. Что-то неизбежно сломается, или мы найдем ограничение, которое мы не учли, и мы сразу же застрянем, и нам придется переосмыслить основную часть системы. Рамки хороши в использовании, если они тщательно продуманы.
objectForKey:
- это метод NSDictionary
. NSDictionary
- это класс коллекции, аналогичный NSArray
, за исключением того, что вместо использования индексов он использует ключи для различения элементов. Ключ - это произвольная строка, которую вы вводите. Никакие два объекта не могут иметь одинаковый ключ (точно так же, как никакие два объекта в NSArray
не могут иметь одинаковый индекс).
valueForKey:
- это метод KVC. Работает с ЛЮБЫМ классом. valueForKey:
позволяет получить доступ к свойству, используя строку для его имени. Так, например, если у меня есть класс Account
со свойством accountNumber
, я могу сделать следующее:
NSNumber *anAccountNumber = [NSNumber numberWithInt:12345];
Account *newAccount = [[Account alloc] init];
[newAccount setAccountNumber:anAccountNUmber];
NSNumber *anotherAccountNumber = [newAccount accountNumber];
Используя KVC, я могу получить доступ к свойству динамически:
NSNumber *anAccountNumber = [NSNumber numberWithInt:12345];
Account *newAccount = [[Account alloc] init];
[newAccount setValue:anAccountNumber forKey:@"accountNumber"];
NSNumber *anotherAccountNumber = [newAccount valueForKey:@"accountNumber"];
Те являются эквивалентными наборами утверждений.
Я знаю, что вы думаете: вау, но саркастично. KVC не выглядит таким уж полезным. На самом деле это выглядит "многословно". Но когда вы хотите что-то изменить во время выполнения, вы можете делать множество интересных вещей, которые намного сложнее на других языках (но это выходит за рамки вашего вопроса).
Если вы хотите узнать больше о KVC, там Есть много руководств, если вы используете Google, особенно в блоге Скотта Стивенсона . Вы также можете ознакомиться с Справочником по протоколу NSKeyValueCoding .
Надеюсь, что это поможет.
есть много руководств, если вы используете Google, особенно в блоге Скотта Стивенсона . Вы также можете ознакомиться с Справочником по протоколу NSKeyValueCoding .Надеюсь, что это поможет.
есть много руководств, если вы используете Google, особенно в блоге Скотта Стивенсона . Вы также можете ознакомиться с Справочником по протоколу NSKeyValueCoding .Надеюсь, что это поможет.
Когда вы выполняете valueForKey:
, вам нужно дать ему NSString, тогда как objectForKey:
может принимать любой подкласс NSObject в качестве ключа. Это связано с тем, что для кодирования «ключ-значение» ключи всегда являются строками.
Фактически, в документации указано, что даже когда вы даете valueForKey:
NSString, он будет вызывать objectForKey:
в любом случае, если строка не начинается с @
, и в этом случае она вызывает [super valueForKey:]
, который может вызвать valueForUndefinedKey:
, что может вызвать исключение.