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.