J'ai un NSArray
formé avec des objets d'une classe personnalisée. La classe a 3 propriétés de chaîne (ville, état, Zip). Je voudrais obtenir toutes les valeurs d'état uniques du array
.
J'ai lu la classe NSPredicate
mais je ne savais pas comment l'utiliser dans ce cas. Les seuls exemples que j'ai pu trouver étaient pour les opérations de chaîne.
Quelqu'un peut-il m'aider?
La doublure totalement simple:
NSSet *uniqueStates = [NSSet setWithArray:[myArrayOfCustomObjects valueForKey:@"state"]];
L'astuce est le valueForKey:
méthode de NSArray
. Cela parcourra votre tableau (myArrayOfCustomObjects
), appelez le -state
méthode sur chaque objet, et construire un tableau des résultats. Nous créons ensuite un NSSet
avec le tableau d'états résultant pour supprimer les doublons.
À partir d'iOS 5 et d'OS X 10.7, une nouvelle classe peut également le faire: NSOrderedSet
. L'avantage d'un ensemble ordonné est qu'il supprimera tous les doublons, mais maintiendra également l'ordre relatif.
NSArray *states = [myArrayOfCustomObjects valueForKey:@"state"];
NSOrderedSet *orderedSet = [NSOrderedSet orderedSetWithArray:states];
NSSet *uniqueStates = [orderedSet set];
Jetez un oeil à keypaths . Ils sont super puissants et je les utilise la plupart du temps à la place des classes NSPredicate. Voici comment vous les utiliseriez dans votre exemple ...
NSArray *uniqueStates;
uniqueStates = [customObjects valueForKeyPath:@"@distinctUnionOfObjects.state"];
Notez l'utilisation de valueForKeyPath au lieu de valueForKey .
Voici un exemple plus détaillé/artificiel ...
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"