it-swarm.com.ru

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

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

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

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

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

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

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

Есть идеи?

Спасибо,

Майк

18
Michael Waterfall

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

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

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

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

20
pxl

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

Причина в том, что эти:

[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"]

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

13
TechZen

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

1
Kendall Helmstetter Gelner

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

Swizzle

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

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

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

0
onmyway133