2009-09-17 15 views
50

Ho un formato con oggetti di una classe personalizzata. La classe ha 3 proprietà (stringa city, state, zip). Vorrei ottenere tutti i valori di stato univoci dallo array.iPhone - acquisizione di valori univoci dall'oggetto NSArray

Ho letto la classe NSPredicate ma in questo caso non è stato possibile utilizzare molto. Gli unici esempi che ho trovato erano per le operazioni con le stringhe.

Qualcuno può aiutarmi?

risposta

117

L'totalmente semplice rivestimento:

NSSet *uniqueStates = [NSSet setWithArray:[myArrayOfCustomObjects valueForKey:@"state"]]; 

Il trucco è il metodo di NSArrayvalueForKey:. In tal modo si scorre l'array (myArrayOfCustomObjects), si chiama il metodo -state su ciascun oggetto e si crea un array di risultati. Creiamo quindi uno NSSet con la matrice risultante di stati per rimuovere i duplicati.


partire con iOS 5 e OS X 10.7, c'è una nuova classe che può fare anche questo: NSOrderedSet. Il vantaggio di un insieme ordinato è che rimuoverà qualsiasi duplicato, ma manterrà anche l'ordine relativo.

NSArray *states = [myArrayOfCustomObjects valueForKey:@"state"]; 
NSOrderedSet *orderedSet = [NSOrderedSet orderedSetWithArray:states]; 
NSSet *uniqueStates = [orderedSet set]; 
+0

Mentre mi piace anche il potere di @distinctUnionOfObjects, e, di conseguenza, l'utente risposta probablyCorey ha dato, il vantaggio di questo approccio sintetico qui in questa soluzione è che l'ordinamento è preservato. – idStar

134

Dai uno sguardo allo keypaths. Sono super potenti e li uso al posto delle classi NSPredicate per la maggior parte del tempo. Ecco come li usa nel tuo esempio ...

NSArray *uniqueStates; 
uniqueStates = [customObjects valueForKeyPath:@"@distinctUnionOfObjects.state"]; 

Nota l'uso di valueForKeyPath invece di valueForKey.

Ecco un esempio più dettagliato/artificioso ...

NSDictionary *arnold = [NSDictionary dictionaryWithObjectsAndKeys:@"arnold", @"name", @"california", @"state", nil]; 
NSDictionary *jimmy = [NSDictionary dictionaryWithObjectsAndKeys:@"jimmy", @"name", @"new york", @"state", nil]; 
NSDictionary *henry = [NSDictionary dictionaryWithObjectsAndKeys:@"henry", @"name", @"michigan", @"state", nil]; 
NSDictionary *woz = [NSDictionary dictionaryWithObjectsAndKeys:@"woz", @"name", @"california", @"state", nil]; 

NSArray *people = [NSArray arrayWithObjects:arnold, jimmy, henry, woz, nil]; 

NSLog(@"Unique States:\n %@", [people valueForKeyPath:@"@distinctUnionOfObjects.state"]); 

// OUTPUT 
// Unique States: 
// "california", 
// "michigan", 
// "new york" 
+17

Avvertenza: valueForKeyPath: @ "distinctUnionOfObjects.PROPERTY" non conserva l'ordinamento. –

+0

grazie a @RobertAltman, per averlo indicato. Immagino che mi abbia risparmiato un po 'di tempo di debug – Hulvej

+0

Cosa succede se l'oggetto chiave è un array e il valore esiste sul primo indice di esso? –

Problemi correlati