2009-10-26 4 views
3

J'ai plusieurs objets configurés dans les données de base, dont l'un est "Deck" et l'autre "Card" . Les "cartes" ont plusieurs relations numérotées, y compris "id". "Deck" a une relation un-à-plusieurs avec les cartes.Obtention de la valeur minimale d'un attribut dans un NSSet à partir d'une relation un-à-plusieurs dans les données de base

Quelle est la meilleure façon de trouver la carte dans une plate-forme qui a la valeur minimale d'un attribut numéroté, tel que id?

Il est clair que je peux obtenir la liste des cartes comme ceci:

NSSet *cardList = self.cards; 

Je pense que je peux construire une expression pour obtenir un minimum comme celui-ci:

NSExpression *keyPathExpression = [NSExpression expressionForKeyPath:@"id"]; 
NSExpression *minExpression = [NSExpression expressionForFunction:@"min:" 
      arguments:[NSArray arrayWithObject:keyPathExpression]]; 

Mais je ne peux pas tout à fait Suss comment utiliser cette expression pour extraire la carte avec la valeur minimum de id (ou juste la valeur minimale de id).

+0

Pour référence ultérieure, j'écrit ce qui suit deux fonctions basées sur les conseils de Barry Wark: - (NSNumber *) numberForLeast: (NSString *) leastId { \t NSString * KeyPath = [NSString stringWithFormat: @ cartes "@. min.% @ ", leastId]; \t NSNumber * minId = [self valueForKeyPath: chemin de clé]; \t \t \t return minId; } - (NSSet *) cardsForLeast: (NSString *) leastId { \t \t NSString * KeyPath = [NSString stringWithFormat: @ ". @ Cartes min% @", leastId]; \t NSNumber * minId = [self valueForKeyPath: chemin de clé]; NSSet * minCards = [self.cards filteredSetUsingPredicate: [NSPredicate prédicatWithFormat: @ "id ==% @", minId]]; \t \t \t retour minCards; } –

Répondre

7

Vous pouvez le faire en utilisant le codage clé-valeur:

//assuming Card has an Id property which is a number 
NSNumber *minId = [deck valueForKeyPath:@"[email protected]"]; 

NSSet *minCards = [[deck cards] filteredSetUsingPredicate:[NSPredicate predicateWithFormat:@"Id==%@", minId]]; 

donnera la NSSet de cartes dont Id propriété est égale au minimum à deck.cards. Pour plus d'informations, reportez-vous à la description du Guide de programmation de la valeur-clé de Set and Array Operators pour plus d'informations.

+0

Incroyablement simple. –

+0

Oui, bien que je doive rechercher la syntaxe exacte chaque fois que je l'utilise, l'ensemble de codage Key-Value et les opérateurs de tableau rendent certains algorithmes * très faciles à exprimer. Ah, la puissance d'un langage dynamique. –

Questions connexes