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.

È stato utile?

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;
                             }];
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top