Разница между objectForKey и valueForKey?
в чем разница между objectForKey
и valueForKey
?
Я посмотрел в документации и они для меня одинаковы.
4 ответа:
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.
надеюсь, что это поможет.
когда вы
valueForKey:
вам нужно дать ему NSString, тогда какobjectForKey:
может принимать любой подкласс NSObject в качестве ключа. Это происходит потому, что для кодирования ключ-значение ключи всегда являются строками.в самом деле, в документации говорится, что даже когда вы даете
valueForKey:
NSString, он вызоветobjectForKey:
в любом случае, если строка начинается с@
в этом случае он вызывает[super valueForKey:]
, которые могут вызватьvalueForUndefinedKey:
что может вызвать исключение.
вот отличный повод для использования
objectForKey:
везде, где это возможно, вместоvalueForKey:
-valueForKey:
с неизвестным ключом броситNSUnknownKeyException
говоря: "этот класс не является значением ключа кодирования-совместимый для ключа ".
как сказал
objectForKey:
тип данных:(id)aKey
аvalueForKey:
тип данных:(NSString *)key
.например:
NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:[NSArray arrayWithObject:@"123"],[NSNumber numberWithInteger:5], nil]; NSLog(@"objectForKey : --- %@",[dict objectForKey:[NSNumber numberWithInteger:5]]); //This will work fine and prints ( 123 ) NSLog(@"valueForKey : --- %@",[dict valueForKey:[NSNumber numberWithInteger:5]]); //it gives warning "Incompatible pointer types sending 'NSNumber *' to parameter of type 'NSString *'" ---- This will crash on runtime.
и
valueForKey:
будет принимать только строковое значение и является методом KVC, тогда какobjectForKey:
будет принимать любой тип объекта.значение
objectForKey
будет доступен тот же тип объекта.