我正试图通过以下方式获得整个公司的总薪水:
NSNumber *totalSalary = [company valueForKeyPath:@"departments.employees.@sum.salary"];
但我一直收到这个错误,“ - [__ NSSet0 decimalValue]:无法识别的选择器发送到实例0x10031eb00”。
我认为我做错了什么,但我不确定在哪里。
答案 0 :(得分:8)
不要害怕。尽管KVC中的集合和数组运算符非常强大,但我仍然发现自己几乎每次在复杂的密钥路径中使用它时都必须参考文档。因为valueForKeyPath:
是一种方法,所以可以从调试器控制台调用它。我经常发现正确的关键路径需要在KVC调用之前设置一个断点并在调试器控制台中尝试一些东西。 Python与PyObjC(自10.5以来包含在OSX中)也是一个很好的交互式环境来测试/调试KVC密钥路径。在这个特定的例子......
@sum
将-[NSNumber decimalValue]
消息发送到[company valueForKeyPath:@"departments.employees"]
返回的每个项目(键值编码语言中的“接收数组”)。因此,它期望接收数组中的每个项目都是NSNumber
。我怀疑company.departments
是一个集合,因此[company valueForKeyPath:@"departments.employees"]
是一组集合,而不是NSNumbers
的集合。我相信你想要创建一个所有员工的“扁平”集合,然后你可以从中计算出总和:
id allEmployees = [company valueForKeyPath:@"departments.@distinctUnionOfSets.employees"];
NSNumber *totalSalary = [allEmployees valueForKeyPath:@"@sum.salary"];
假设每个员工只在一个部门,以下似乎也可以工作
NSNumber *totalSalary = [company valueForKeyPath:@"departments.@sum.employees.@sum.salary"];
答案 1 :(得分:2)
您似乎正在遍历多个集合(所有部门的集合以及这些部门的员工集合)。在汇总之前,您需要将它们合并到一个容器(所有员工)中。
在这里查看@unionOf ... set和数组运算符:
我没试过这个,但我认为是部门。@ unionOfSets.employees。@ sum.salary是正确的方法。如果不是,请告诉我!
更新: Barry Wark打败了我。 :-)他是对的,它是不同的集合联盟,否则,无论员工属于多个部门,你都会得到重复的员工。虽然我不认为有必要分两步完成:
@“departments。@ distinctUnionOfSets.employees。@ sum.salary”应该这样做。