objective iphone nsarray nspredicate

iphone - nspredicate objective c



iPhone-obteniendo valores Ășnicos del objeto NSArray (2)

Tengo un NSArray formado con objetos de una clase personalizada. La clase tiene 3 propiedades de cadena (ciudad, estado, zip). Me gustaría obtener todos los valores de estado únicos de la array .

Leí la clase NSPredicate pero no pude sacarle mucha información sobre cómo usarla en este caso. Los únicos ejemplos que pude encontrar fueron para operaciones de cuerda.

¿Puede alguien ayudarme?


Echa un vistazo a keypaths . Son muy poderosos y los uso en lugar de NSPredicate clases la mayoría del tiempo. Así es como los usarías en tu ejemplo ...

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

Tenga en cuenta el uso de valueForKeyPath en lugar de valueForKey .

Aquí hay un ejemplo más detallado / artificial ...

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"


El delineador de líneas totalmente simple:

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

El truco es el método valueForKey: NSArray . Eso iterará a través de su matriz ( myArrayOfCustomObjects ), llamará al método -state en cada objeto y construirá una matriz de resultados. Luego creamos un NSSet con la matriz resultante de estados para eliminar duplicados.

Comenzando con iOS 5 y OS X 10.7, hay una nueva clase que también puede hacer esto: NSOrderedSet . La ventaja de un conjunto ordenado es que eliminará cualquier duplicado, pero también mantendrá el orden relativo.

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