Различие между objectForKey и valueForKey?

Мнение: рамки и компоненты третьей части следует использовать только в качестве крайней меры.

Я часто вижу, как программисты сразу выбирают среду для выполнения задачи, не изучая базовый подход, который требуется для работы. Что-то неизбежно сломается, или мы найдем ограничение, которое мы не учли, и мы сразу же застрянем, и нам придется переосмыслить основную часть системы. Рамки хороши в использовании, если они тщательно продуманы.

343
задан James Webster 7 August 2015 в 03:46
поделиться

2 ответа

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 .

Надеюсь, что это поможет.

401
ответ дан 23 November 2019 в 00:33
поделиться

Когда вы выполняете valueForKey: , вам нужно дать ему NSString, тогда как objectForKey: может принимать любой подкласс NSObject в качестве ключа. Это связано с тем, что для кодирования «ключ-значение» ключи всегда являются строками.

Фактически, в документации указано, что даже когда вы даете valueForKey: NSString, он будет вызывать objectForKey: в любом случае, если строка не начинается с @ , и в этом случае она вызывает [super valueForKey:] , который может вызвать valueForUndefinedKey: , что может вызвать исключение.

64
ответ дан 23 November 2019 в 00:33
поделиться