Использование valueForKeyPath в NSDictionary, если ключ запускает символ @?
Я хочу использовать valueForKeyPath
в моем NSDictionary
, но проблема в том, что одним из ключей является строка, которая начинается с символа @. У меня нет контроля над наименованием ключа.
У меня возникли проблемы с попыткой создать ключевой путь, поскольку я получаю исключение формата даже при попытке избежать символа @:
Это отлично работает:
[[[dict objectForKey:@"key1"] objectForKey:@"@specialKey"] objectForKey:@"key3"]
Однако ни одна из этих работ не работает:
[dict valueForKeyPath:@"[email protected]"]
[dict valueForKeyPath:@"[email protected]@specialKey.key3"]
Любые идеи?
Спасибо,
Mike
Ответы
Ответ 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
, переместите все клавиши и удалите символ @