Подтвердить что ты не робот

Использование valueForKeyPath в NSDictionary, если ключ запускает символ @?

Я хочу использовать valueForKeyPath в моем NSDictionary, но проблема в том, что одним из ключей является строка, которая начинается с символа @. У меня нет контроля над наименованием ключа.

У меня возникли проблемы с попыткой создать ключевой путь, поскольку я получаю исключение формата даже при попытке избежать символа @:

Это отлично работает:

[[[dict objectForKey:@"key1"] objectForKey:@"@specialKey"] objectForKey:@"key3"]

Однако ни одна из этих работ не работает:

[dict valueForKeyPath:@"[email protected]"]
[dict valueForKeyPath:@"[email protected]@specialKey.key3"]

Любые идеи?

Спасибо,

Mike

4b9b3361

Ответ 1

вам не следует использовать знаки @с вашими именами ключей, если вы хотите использовать кодировку с ключом.

рекомендации для Apple для ключевых имен:

Ключи должны использовать кодировку ASCII, начинать с буквой в нижнем регистре и не может содержат пробелы.

Вам нужно будет найти временное решение для переформатирования ключевой строки, когда вы получите ключи от KVC-совместимого.

Ответ 2

Просто обновить этот старый вопрос немного...

Причина, по которой эти:

[dict valueForKeyPath:@"[email protected]"]
[dict valueForKeyPath:@"[email protected]@specialKey.key3"]

... fail заключается в том, что любые символы "@" в ключевом тракте интерпретируются как операторы коллекции, например:

[dict valueForKeyPath:@"[email protected]"] // returns the sum of all 'key3' values
[dict valueForKeyPath:@"[email protected]"] // returns the average of all 'key3' values

Вложенные вызовы клавиш:

[[[dict objectForKey:@"key1"] objectForKey:@"@specialKey"] objectForKey:@"key3"]

... работать, потому что один ключ не обрабатывается как ключевой путь.

Ответ 3

Если у вас нет контроля над наименованием, как насчет добавления категории с соответствующим именем, который просто возвращает/устанавливает странный ключ?

Ответ 4

Я вижу, что есть 2 способа

Swizzle

Вы можете использовать valueForKeyPath на NSDictionary, чтобы удалить символ @, не забывайте учитывать @sum, @average,...

Переопределить, если вы используете Mantle

Переопределите + (id)modelOfClass:(Class)modelClass fromJSONDictionary:(NSDictionary *)JSONDictionary на MTLJSONAdapter, переместите все клавиши и удалите символ @