2009-11-03 52 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