2009-07-10 227 views
7

我認爲有一種方法可以快速詢問NSSet來輪詢其成員,並在其每個對象中返回一個說明NSInteger屬性的總和,但我可能很容易將此與Mac OS X的事物混淆。這是否存在於Cococa Touch?總結NSSet中所有對象屬性的快速方法?

我能找到的最接近的是objectEnumerator,據此我想我可以通過每個對象來增加自己的變量。更好的方式存在嗎?

+0

你是在談論NSArrayController arrangeObjects。@ sum。 ... 東東?我不確定如何將它與NSSet連接起來,以及如何計算特定班級成員的數量......我會高興地閱讀這些內容。 – stefanB 2009-07-10 02:07:44

回答

15

如果你想找到一個數組/套派生類中的每個成員一個屬性(theIntegerPropertyToSum)這是符合KVC-(theSet)的總和,你可以做到以下幾點:

NSNumber* theSum = [theSet valueForKeyPath:@"@sum.theIntegerPropertyToSum"]; 
+0

這太棒了!順便說一下,它是否記錄在案?我似乎無法找到/在KVC協議參考中的「valueForKeyPath:」的定義中的任何內容... – Meltemi 2009-07-15 05:37:50

+0

它們被稱爲關鍵值編碼集合操作符,並且文檔很難找到... http:// developer .apple.com/library/ios/#documentation/cocoa/conceptual/KeyValueCoding/Articles/CollectionOperators.html – 2013-01-25 20:13:22

+0

此代碼不易維護,並且會讓人們感到困惑。 – 2013-01-28 16:20:38

-3

爲什麼不使用普通物鏡C(2)?

NSInteger theSum = 0; 
for (id obj in theSetOrArray) 
    theSum += obj.theIntegerPropertyToSum; 

缺點: 如果你喜歡數線,那麼這看起來更長。是否還有其他缺點 - 我不知道KVC方法會發生什麼情況,對象沒有所需的'theIntegerPropertyToSum'屬性?

優點: 我敢打賭,這種調試和性能測試更容易。另外,當別人在一兩年內讀取你的代碼時,他們會知道這裏發生了什麼 - 無論他們是否看過一行目標C,這看起來像是實際發生的事情。

+2

你的答案意味着你沒有使用或閱讀KVC上的文檔 - 你可能想在不應該使用它之前先閱讀它。 在您的「普通目標C(2)」示例中,如果未定義TheIntegerPropertyToSum或者一個值爲-1而另一個值爲1.2,會發生什麼情況?如果它是零呢? – 2009-07-10 08:42:09

+0

我始終使用KVC - 讓UI與代碼進行通信。 [theSet valueForKeyPath:@「@ sum.theIntegerPropertyToSum」]的缺點是,它是一種語言結構,並不能一目瞭然地顯示發生了什麼。任何JavaScript C,看到valueForKeyPath語句的C#程序員都不會理解它 - 並且被吸進耗費時間的課程中,以便弄清楚一行代碼的作用。除非你需要它們,否則不要使用語言特定的結構。讓我想起了STL C++代碼,除了STL專家,這些代碼對所有人都是不可讀的。 – 2009-07-11 13:40:00

+1

聽起來就像你一直在使用KVO,而不是KVC。 – 2009-07-12 13:38:25