Teo*_*ing 1 cocoa core-data objective-c
我想通过以下方式获得整个公司的总薪水:
NSNumber *totalSalary = [company valueForKeyPath:@"departments.employees.@sum.salary"];
Run Code Online (Sandbox Code Playgroud)
但我一直收到这个错误," - [__ NSSet0 decimalValue]:无法识别的选择器发送到实例0x10031eb00".
我想我做错了但我不知道在哪里.
别害怕.尽管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"];
Run Code Online (Sandbox Code Playgroud)
假设每个员工只在一个部门,以下也似乎有效
NSNumber *totalSalary = [company valueForKeyPath:@"departments.@sum.employees.@sum.salary"];
Run Code Online (Sandbox Code Playgroud)