2009-11-03 50 views
1

我试图通过获得的总薪酬为一体的公司:谓词总结孩子的价值

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

,但我不断收到此错误“ - [__ NSSet0 decimalValue]:无法识别的选择发送到实例0x10031eb00” 。

我想我做错了什么,但我不知道在哪里。

回答

8

不要害怕。尽管KVC中的集合和数组运算符非常强大,但我仍然发现自己几乎每次在像这样的复杂关键路径中使用它们时都必须参考文档。由于valueForKeyPath:是一种方法,因此可以从调试器控制台调用它。我经常发现获得正确的关键路径需要在KVC调用之前设置一个断点,并在调试器控制台中尝试一些东西。 PyObjC(自10.5版以后包含在OSX中)的Python也是测试/调试KVC keypath的一个很好的交互式环境。在这个特例中...

@sum-[NSNumber decimalValue]消息发送给[company valueForKeyPath:@"departments.employees"](键值编码语言中的“接收数组”)返回的每个项目。因此预计接收阵列中的每个项目是NSNumber。我怀疑company.departments是一个集合,因此[company valueForKeyPath:@"departments.employees"]是一组集合,而不是集合NSNumbers。我相信你想创建的所有员工的“扁平化”的收集,从中你可以再计算总和:

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

假设每个员工只在一个部门,下面还似乎工作

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

嗯我不知道我们可以交互使用调试器,我一直认为如果我们想要我们可以使用Ruby Cocoa或PyObjC。但是THANKs! – 2009-11-03 22:56:14

2

您似乎要遍历几个集合(所有部门的集合以及这些部门的员工的集合)。在总结他们之前,您需要将它们合并到一个容器(所有员工)中。

退房的@unionOf ...设置和数组运算符这里:。

http://tinyurl.com/yk5njks

我没有试过,但我认为部门@ unionOfSets.employees @ sum.salary是正确的方法来做到这一点。让我知道否则!

更新:巴里·沃克击败了我。 :-)他是对的,它是截然不同的集合的联合,否则,无论员工属于多个部门,你都可以重复雇员。虽然我不认为有必要分两步做:

@“departments。@ distinctUnionOfSets.employees。@ sum.salary”应该这样做。

+0

我不认为@“部门。@ distinctUnionOfSets.employees。@ sum.salary”将工作。员工。@ sum.salary不是一个集合,所以你不能把所有这些集合联合起来。 – 2009-11-03 17:03:41

+0

我试过了,没有工作。 – 2009-11-03 23:08:24