我正在尝试通过以下方式获得整个公司的总薪资:

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


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

我认为我做错了事,但不确定在哪里。

最佳答案

不要害怕尽管KVC中的set和array运算符非常强大,但我仍然发现自己几乎每次在像这样的复杂键路径中使用它们时都必须参考文档。因为valueForKeyPath:是一种方法,所以可以从调试器控制台中调用它。我经常发现,正确设置键路径需要在KVC调用之前设置一个断点,并在调试器控制台中尝试一些操作。带有PyObjC的Python(自10.5起包含在OSX中)还是一个很好的交互式环境,可以测试/调试KVC密钥路径。在这个特定的例子中...

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

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


假设每个员工都在一个部门中,则以下内容也可以正常工作

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

10-08 14:04