Ошибка при получении значений из NSDictionary - PullRequest
0 голосов
/ 28 февраля 2019

Я пытаюсь получить значение из NSDictionary, но получаю исключение, что ключи не определены.

NSDictionary *userNames=[[NSDictionary alloc] init]; 
NSString * testValue = @"";
testValue = [userNames valueForKey:@"@&"];//crashing here when key is @&

Завершение работы приложения из-за необработанного исключения 'NSUnknownKeyException', причина: '[<<__NSDictionaryM 0x2831eeec0> valueForUndefinedKey:]

Ответы [ 3 ]

0 голосов
/ 28 февраля 2019

Apple doc

Если ключ не начинается с «@», вызывает объект (forKey :).Если клавиша начинается с «@», обрезает «@» и вызывает [super valueForKey:] с остальной частью клавиши.

вы можете сделать

testValue = [userNames objectForKey:@"@&"]

или

testValue = [userNames valueForKey:@"&"]

0 голосов
/ 28 февраля 2019

Возможно, вы не объявляете ключи и значения.NSDictionary требует от вас инициализации со значениями и ключами.(Независимо от того, извлекаете ли они их из файла или объявляете их при инициализации.

NSDictionary * userNames = [[NSDictionary alloc] initWithObjectsAndKeys:
                            @"value1", @"key1",
                            @"value2", @"key2",
                            nil];

NSString * testValue = [userNames valueForKey:@"key2"];
NSLog(@"%@", testValue);

Также обратите внимание, что значение записывается раньше, а затем определяется ключ. См. Этот документ .

Если вы хотите сначала объявить словарь (как вы сделали в своем вопросе), а затем добавить значения и ключи в словарь, вы должны использовать NSMutableDictionary.

NSMutableDictionary *userNames1 = [[NSMutableDictionary alloc] init];
[userNames1 setValue:@"firstValue" forKey:@"key1"];
[userNames1 setValue:@"secondValue" forKey:@"key2"];

NSLog(@"%@", [userNames1 valueForKey:@"key2"]);
0 голосов
/ 28 февраля 2019

Никогда используйте valueForKey для получения единственного значения из словаря, если вы не знаете, что такое KVC, и вам действительно нужен KVC.

Словарь пустой, ключ не существуети ведущий @ имеет особое значение в KVC, поэтому valueForKey в этом случае дает сбой.

Правильный API - это objectForKey, но просто используйте современную подписку на ключ, чтобы получить по крайней мере nil, если ключне существует

testValue = userNames[@"@&"];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...