web-dev-qa-db-fra.com

Comment rechercher un NSSet ou NSArray pour un objet qui a une valeur spécifique pour une propriété spécifique?

Comment rechercher un NSSet ou NSArray pour un objet qui a une valeur spécifique pour une propriété spécifique?

Exemple: J'ai un NSSet avec 20 objets, et chaque objet a une propriété type. Je veux obtenir le premier objet qui a [theObject.type isEqualToString:@"standard"].

Je me souviens qu'il était possible d'utiliser des prédicats d'une manière ou d'une autre pour ce genre de choses, non?

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

NB: La notion de premier objet trouvé dans un NSSet n'a aucun sens car l'ordre des objets dans un ensemble n'est pas défini.

78
Ole Begemann

Vous pouvez obtenir le tableau filtré comme Jason et Ole l'ont décrit, mais comme vous ne voulez qu'un seul objet, j'utiliserais - indexOfObjectPassingTest: (s'il est dans un tableau) ou -objectPassingTest: (s'il est dans un ensemble) et évitez de créer le deuxième tableau.

17
NSResponder

En général, j'utilise indexOfObjectPassingTest: car je trouve plus pratique d'exprimer mon test en code Objective-C plutôt qu'en syntaxe NSPredicate. Voici un exemple simple (imaginez que integerValue était en fait une propriété):

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);

La sortie de ce code est:

hasTwo: YES (index was 2)
hasFour: NO (index was 2147483647)
15
Carl Veazey
NSArray* results = [theFullArray filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"SELF.type LIKE[cd] %@", @"standard"]];
4
Jason Coco