2012-05-24 20 views
6

Sto tentando di utilizzare il caso incase-sensitive per la risposta JSON su NSDictionary, poiché a volte il mio tipo di chiavi di risposta varia, alcune sono cammello, altre minuscole o miste. Esiste una funzionalità integrata per verificare la presenza di un caso in-sensibilità per questo caso?Maiuscole/minuscole per NSDictionary

Grazie.

+4

avete considerato una semplice conversione della chiave a tutti in minuscolo prima di aggiungerlo al dizionario? Quindi ogni volta che cerchi una chiave, convertila. – Matt

+0

Qualche idea su come farlo? – kforkarim

risposta

6

Ultimamente ho condiviso due classi che potrebbero soddisfare le vostre esigenze. Forniscono operazioni senza distinzione tra maiuscole e minuscole (denominate dopo i metodi NSDictionary e NSMutableDictionary) mantenendo le chiavi originariamente inserite.

fare un tentativo:

https://github.com/keeshux/ios-components/tree/master/Components/Utils/KSCIDictionary

+1

Mi piace che tu usi un dizionario di mappatura per preservare il caso della chiave e preservare anche la complessità 'log (n)' dell'algoritmo di ricerca. La maggior parte delle soluzioni abbandonano l'una o l'altra di quelle. – Peter

3
- (NSString *)lowercaseString 

E 'un metodo NSString di default, basta fare [lowercaseString chiave] quando vengono aggiunti alla, o la lettura dal NSMutableDictionary.

+0

Anche se tutte le risposte sono corrette qui, ho dovuto utilizzare questo concetto fino a deserializzare i miei dati e inserire le chiavi, in minuscolo e tutto ora funziona come un incantesimo. Grazie a tutti – kforkarim

+1

Per comodità, è possibile scrivere una sottoclasse 'CaseInsensitive [Mutable] Dictionary 'del dizionario NS [Mutable]. Dovresti sovrascrivere ogni metodo che accetta una chiave come argomento e chiama il metodo super usando '[chiave minuscoloStringa]'. Ora il tuo codice client rimane perfettamente leggibile: deve solo usare un 'CaseInsensitiveMutableDictionary' invece di un' NSMutableDictionary'. – Timo

5

Il modo migliore sarebbe impostare la chiave affinché NSDictionary sia tutto in minuscolo o tutto maiuscolo;

Ad esempio, diciamo che ho un NSArray di stringhe. Ho potuto ottenere il keyName prima che io lo uso e convertirlo utilizzando l'lowercaseString o uppercaseString

NSString *itemName = @"lastName"; 
itemName = [itemName lowercaseString]; 

questo cambierà la stringa per cognome o se ho usato uppercaseString sarebbe LASTNAME

oppure si può anche cambiare il nome della chiave quando vengono aggiunti alla Dizionario in questo modo:

NSMutableDictionary *dict = [[NSMutableDictionary alloc] init]; 
[dict setObject:objectToAdd forKey:[key uppercaseString]]; 
0

Nel mio caso, non ho bisogno di tutti i metodi o proprietà Dictionary. Avevo solo bisogno dell'accesso al pedice insensibile alle maiuscole. Ho fatto una classe personalizzata (non una superclasse di NSMutableDictionary) e implementato i metodi per consentire l'accesso subscripted e fatto quelle case insensitive:

- (id) objectForKeyedSubscript: (NSString *) key { 
    NSMutableDictionary *theData = self->data; 
    return theData[[key lowercaseString]]; 
} 

- (void) setObject: (id) newValue forKeyedSubscript: (NSString *) key { 
    NSMutableDictionary *theData = self->data; 
    theData[[key lowercaseString]] = newValue; 
} 

Vedi anche: http://clang.llvm.org/docs/ObjectiveCLiterals.html