Могу ли я изменить ключ Nsdictionies?
-
04-10-2019 - |
Вопрос
У меня есть Nsdictionary объект, который заполняется NSMutableStress для его клавиш и объектов. Я смог изменить ключ, изменив исходное NsmutableString с помощью SetString: метод. Однако они, однако, остаются преданными, независимо от содержимого строки, используемой для первоначального установки ключа.
Мой вопрос в том, это ключ защищен от изменения, означающий, что он всегда будет одинаковым, если я не удалю его и добавим другого к словарю?
Спасибо.
Решение
Ключи есть -copy
Когда элементы установлены, чтобы вы не могли меняться потом бесполезны.
Методы, которые добавляют записи в словари - будь то часть инициализации (для всех словарей) или во время модификации (для смежных словарей) -Copy каждый клавишный аргумент (ключи должен соответствовать
NSCopying
Протокол) и добавьте копии в словарь. Каждое соответствующее значение Value получает сохранение сообщения, чтобы гарантировать, что он не будет отделен до этого словарь.
Вы можете использовать CFDictionary с KCFTyPedictionAryKeyCallbacks или просто заменить элемент:
id value = [dictionary objectWithKey:oldKey];
[dictionary setObject:value withKey:newKey];
[dictionary removeObjectForKey:oldKey];
Другие советы
Попробуйте использовать NSMutableDictionary
, вместо.
Вы можете создать копию словаря, фильтруя клавиши, как вы идете. Я делаю это для преобразования Case Case и подчеркивает при заполнение объектов от JSON с использованием KVC. Увидеть мою библиотеку рефакторинга, es_ios_utils., для источника. ESNSCATTARTES.H. предоставляет:
@interface NSMutableDictionary(ESUtils)
//Changes keys using keyFilter. If keyFilter generates duplicate non-unique keys, objects will be overwritten.
-(void)addEntriesFromDictionary:(NSDictionary*)d withKeyFilter:(NSString*(^)(NSString*))keyFilter;
...
Итак, чтобы сделать все клавиши заглавными буквами, вы могли бы сделать что-то вроде:
NSMutableDictionary *md = [NSMutableDictionary dictionaryWithCapacity:oldDictionary.count];
[md addEntriesFromDictionary:oldDictionary
withKeyFilter:^NSString*(NSString *key) {
return key.uppercaseString;
}];