2009-11-03 4 views
1

J'essaie d'obtenir le salaire total pour l'ensemble de l'entreprise par:prédicats pour résumer la valeur de l'enfant

NSNumber *totalSalary = [company valueForKeyPath:@"[email protected]"]; 

Mais je continue à avoir cette erreur, « - [__ NSSet0 DecimalValue]: sélecteur non reconnu envoyé à l'instance 0x10031eb00 » .

Je pense que je fais quelque chose de mal mais je ne sais pas où.

Répondre

8

N'ayez pas peur. Bien que les opérateurs set et array de KVC soient très puissants, je me retrouve toujours à devoir consulter la documentation presque chaque fois que je les utilise dans des chemins clés complexes comme celui-ci. Parce que valueForKeyPath: est une méthode, vous pouvez l'appeler à partir de la console du débogueur. Je trouve souvent que l'obtention d'un chemin d'accès correct nécessite de définir un point d'arrêt juste avant l'appel KVC et d'essayer quelques éléments dans la console du débogueur. Python avec PyObjC (inclus dans OSX depuis 10.5) est aussi un excellent environnement interactif pour tester/déboguer les keypaths KVC. Dans cet exemple particulier ...

@sum envoie le message -[NSNumber decimalValue] à chaque article retourné par [company valueForKeyPath:@"departments.employees"] (le « tableau recevant » en valeur de clé langage de codage). Il s'attend donc à ce que chaque élément du tableau récepteur soit un NSNumber. Je soupçonne que company.departments est un ensemble, ainsi [company valueForKeyPath:@"departments.employees"] est un ensemble d'ensembles, pas une collection de NSNumbers. Je crois que vous voulez créer une collection « aplati » de tous les employés, à partir de laquelle vous pouvez calculer la somme:

id allEmployees = [company valueForKeyPath:@"[email protected]"]; 
NSNumber *totalSalary = [allEmployees valueForKeyPath:@"@sum.salary"]; 

En supposant que chaque employé est dans un seul département, ce qui suit semble également travailler

NSNumber *totalSalary = [company valueForKeyPath:@"[email protected]@sum.salary"]; 
+0

hmm Je ne savais pas que nous pouvions utiliser le débogueur interactivement, j'ai toujours pensé que si nous voulions que nous puissions utiliser Ruby Cocoa ou PyObjC. Mais merci! –

2

Vous semblez traverser plusieurs collections (la collection de tous les départements et la collection des employés de ces départements). Vous devrez les réunir dans un conteneur (tous les employés) avant de les additionner.

Vérifiez la @unionOf ... set et opérateurs de tableaux ici:..

http://tinyurl.com/yk5njks

Je ne l'ai pas essayé, mais je pense que les services @ unionOfSets.employees @ sum.salary est le bonne façon de le faire. Faites-moi savoir s'il en est autrement!

Mise à jour: Barry Wark m'a battu à elle. :-) Il a raison, c'est distinct ensemble d'ensembles, sinon, vous auriez des employés réguliers partout où un employé appartient à plus d'un département. Bien que je ne crois pas qu'il est nécessaire de le faire en deux étapes:

@ "ministères. @ DistinctUnionOfSets.employees. @ Sum.salary" devrait le faire.

+0

Je ne pense pas @ "ministères. @ DistinctUnionOfSets.employees. @ Sum.salary" fonctionnera. Les employés. @ sum.salary n'est pas un ensemble, donc vous ne pouvez pas prendre l'union de tous ces ensembles. –

+0

J'ai essayé cela, n'a pas fonctionné. –