2014-02-17 38 views
1

我在NSManagedObject的子類中有一個方法,它返回所有資產的總和。目前,它看起來像這樣和正常工作在NSManagedObject子類上使用KVC集合運算符

- (NSDecimalNumber *)totalAssetValue 
{ 
    NSDecimalNumber *total = [NSDecimalNumber zero]; 
    for (NSManagedObject *account in [self valueForKey:@"accounts"]) { 
     for (NSManagedObject *asset in [account valueForKey:@"assets"]) { 
      total = [total decimalNumberByAdding:[asset valueForKey:@"assetAmount"]]; 
     } 
    } 
    return total; 
} 

我想用KVC集合運算符來消除環路,所以我想這個

- (NSDecimalNumber *)totalAssetValue 
} 
    return [self valueForKeyPath:@"[email protected]"]; 
} 

不過,我收到以下錯誤

- [__ NSSetI decimalValue]:發送到實例的無法識別的選擇器0x60000000dc70

我有適當的語法來複制上述循環嗎?或者是別的什麼?

回答

2

這應該工作:

- (NSDecimalNumber *)totalAssetValue 
{ 
    return [self valueForKeyPath:@"[email protected]@sum.assetAmount"]; 
} 

兩個「賬戶」和「資產」是一對多的關係,所以你需要兩個「@sum」 運營商(對應於兩個嵌套for循環的原始代碼)。

需要注意的是它沒有正式記錄(據我所知),該鍵 - 值編碼「@sum」 操作返回NSDecimalNumber,它可能是「只是」一個NSNumber

+0

謝謝您正確的文檔狀態「每個數字被轉換爲一個double值,計算值的總和,並將總數作爲NSNumber的一個實例包裝並返回。」 – Cory

+1

@Cory:不幸的是,文檔不正確,比較http://stackoverflow.com/a/15383265/1187415。它使用'NSDecimal'作爲中間結果,並返回'NSDecimalNumber'。我的觀點只是我們不能*依靠那個。 –