2009-07-10 224 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