Posso cambiare una chiave NSDictionaries?
-
04-10-2019 - |
Domanda
Ho un oggetto NSDictionary che è popolata da NSMutableStrings per le sue chiavi e oggetti. Sono stato in grado di cambiare la chiave modificando l'originale NSMutableString con il setString: metodo. Essi chiave comunque rimane la stessa indipendentemente dal contenuto della stringa utilizzata per impostare la chiave inizialmente.
La mia domanda è, è la chiave protetta venga cambiata che significa che sarà sempre lo stesso a meno che non rimuoverlo e aggiungere un altro al dizionario?
Grazie.
Soluzione
I tasti sono -copy
'd quando vengono impostate le voci, quindi non è possibile cambiarlo in seguito è inutile.
I metodi che aggiungere voci di dizionari, sia come parte di inizializzazione (per tutti i dizionari) o durante la modifica (per dizionari mutabili) -Copy ogni argomento chiave (chiavi devono essere conformi al protocollo
NSCopying
) e aggiungere le copie al dizionario. Ogni oggetto valore corrispondente riceve un messaggio conservano per assicurare che non venga deallocato prima che il dizionario è attraverso con esso.
Si potrebbe usare CFDictionary con kCFTypeDictionaryKeyCallBacks, o semplicemente sostituire l'articolo:
id value = [dictionary objectWithKey:oldKey];
[dictionary setObject:value withKey:newKey];
[dictionary removeObjectForKey:oldKey];
Altri suggerimenti
Provare a utilizzare NSMutableDictionary
, invece.
È possibile creare una copia del dizionario, filtrando i tasti, come si va. Lo faccio per la conversione tra cammelli e minuscole e caratteri di sottolineatura durante il popolamento oggetti da JSON utilizzando KVC. Vedere la mia libreria di refactoring, es_ios_utils , per la fonte. ESNSCategories.h prevede quanto segue:
@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;
...
Quindi, per rendere tutti i tasti maiuscolo, si potrebbe fare qualcosa di simile:
NSMutableDictionary *md = [NSMutableDictionary dictionaryWithCapacity:oldDictionary.count];
[md addEntriesFromDictionary:oldDictionary
withKeyFilter:^NSString*(NSString *key) {
return key.uppercaseString;
}];