2012-03-27 7 views
31

Questa potrebbe essere una domanda di base, ma non riesco a trovare una risposta.Ottieni l'array del valore della proprietà di ciascun oggetto in un altro array senza un ciclo for

Supponiamo di avere un NSArray (carArray) con oggetti di un certo tipo (Car).

E 'possibile ottenere un NSArray (colorArray) con tutti i valori di una proprietà (colore) di questi oggetti senza iterare carArray con un ciclo for? (vedi LINQ in .NET)

NSMutableArray *colorList = [[NSMutableArray alloc] initWithCapacity:0]; 

for (Car *car in carArray) 
{ 
    [colorList addObject:car.color]; 
} 

Grazie in anticipo.

risposta

72

Sì. Supponendo che il tuo oggetto stia adottando lo KVC/KVO protocol. È possibile ottenere una vasta gamma di proprietà come:

NSArray *colorList = [carArray valueForKey:@"color"]; 

realtà, ciò che valueForKey: metodo fa, è quello di restituire una matrice contenente i risultati di invocare valueForKey: usando chiave su ciascuno degli oggetti della matrice. (Dalla documentazione di Apple su NSArray)

+0

Stavo guardando questo metodo nei documenti, ma non mi era chiaro cosa esattamente facesse. Potrei averlo provato, naturalmente. –

+0

Attenzione che l'uso di una chiave errata causerà un arresto anomalo in fase di runtime. Questo approccio non ha alcun tipo di sicurezza, quindi non sarai avvisato dal compilatore per l'uso della chiave sbagliata. – damirstuhec

-1

È possibile utilizzare il NSSet per ottenere i colori:

NSSet *NScolors = [NSSet setWithArray:[carArray valueForKey:@"color"]]; 
NSArray *colors = [NScolors allObjects]; 
14

Sì. Puoi farlo senza iterarlo.

NSArray *colorArray = [carArray valueForKeyPath:@"@distinctUnionOfObjects.color"]; 
Problemi correlati