Разница между objectForKey и valueForKey?


в чем разница между objectForKey и valueForKey? Я посмотрел в документации и они для меня одинаковы.

4 335

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 будет доступен тот же тип объекта.