iphone objective-c nsarray nspredicate nsset

iphone - ¿Cómo buscar un NSSet o NSArray para un objeto que tiene un valor específico para una propiedad específica?



objective-c nspredicate (4)

¿Cómo buscar un NSSet o NSArray para un objeto que tiene un valor específico para una propiedad específica?

Ejemplo: Tengo un NSSet con 20 objetos y cada objeto tiene una propiedad de type . Quiero obtener el primer objeto que tiene [theObject.type isEqualToString:@"standard"] .

Recuerdo que era posible usar predicados de alguna manera para este tipo de cosas, ¿verdad?


En general, uso indexOfObjectPassingTest: como me parece más conveniente expresar mi prueba en código Objective-C en lugar de la sintaxis NSPredicate . Aquí hay un ejemplo simple (imagine que integerValue era realmente una propiedad):

NSArray *array = @[@0,@1,@2,@3]; NSUInteger indexOfTwo = [array indexOfObjectPassingTest:^BOOL(id obj, NSUInteger idx, BOOL *stop) { return ([(NSNumber *)obj integerValue] == 2); }]; NSUInteger indexOfFour = [array indexOfObjectPassingTest:^BOOL(id obj, NSUInteger idx, BOOL *stop) { return ([(NSNumber *)obj integerValue] == 4); }]; BOOL hasTwo = (indexOfTwo != NSNotFound); BOOL hasFour = (indexOfFour != NSNotFound); NSLog(@"hasTwo: %@ (index was %d)", hasTwo ? @"YES" : @"NO", indexOfTwo); NSLog(@"hasFour: %@ (index was %d)", hasFour ? @"YES" : @"NO", indexOfFour);

El resultado de este código es:

hasTwo: YES (index was 2) hasFour: NO (index was 2147483647)


Puedes obtener la matriz filtrada como Jason y Ole han descrito, pero como solo quieres un objeto, usaría - indexOfObjectPassingTest: (si está en una matriz) o -objectPassingTest: (si está en un conjunto) y evitarías crear el segundo conjunto.


NSArray* results = [theFullArray filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"SELF.type LIKE[cd] %@", @"standard"]];


NSPredicate *predicate = [NSPredicate predicateWithFormat:@"type == %@", @"standard"]; NSArray *filteredArray = [myArray filteredArrayUsingPredicate:predicate]; id firstFoundObject = nil; firstFoundObject = filteredArray.count > 0 ? filteredArray.firstObject : nil;

NB: La noción del primer objeto encontrado en un NSSet no tiene sentido ya que el orden de los objetos en un conjunto no está definido.