2009-07-10 6 views
7

Pensé que había una forma de preguntar rápidamente a NSSet para sondear a sus miembros y devolver una suma de, por ejemplo, una propiedad NSInteger en cada uno de sus objetos, pero es posible que esté confundiendo esto con el lado de las cosas de Mac OS X. ¿Esto existe en Cococa Touch?¿Forma rápida de sumar una propiedad de todos los objetos dentro de un NSSet?

Lo más parecido que puedo encontrar es objectEnumerator, por lo que supongo que podría filtrar cada objeto e incrementar mi propia variable. ¿Existe la mejor manera?

+0

¿Estás hablando de NSArrayController arrangedObjects. @ Sum. ... cosas? No estoy seguro de cómo conectarlo con NSSet y cómo contar los miembros específicos de la clase ... Tendré que leer sobre eso. – stefanB

Respuesta

15

Si usted está tratando de encontrar la suma de una propiedad determinada (theIntegerPropertyToSum) para cada miembro de un/clase derivada de establecer matriz que es KVC-compatible (theSet), puede hacer lo siguiente:

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

Esto es genial! ¿Dónde, por cierto, está documentado? Parece que no puedo encontrar nada en/alrededor de la definición de "valueForKeyPath:" en la Referencia de Protocolo de KVC ... – Meltemi

+0

se les llama operadores de recolección de códigos de clave y el documento es difícil de encontrar ... http: // desarrollador .apple.com/library/ios/# documentation/cocoa/conceptual/KeyValueCoding/Articles/CollectionOperators.html –

+0

Este código no es compatible con el mantenimiento y puede confundir a las personas más adelante. –

-3

¿Por qué no utilizar el objetivo simple C (2)?

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

Desventaja: Si te gusta contar las líneas, entonces esto parece más larga. ¿Hay otras desventajas? Me pregunto qué sucede con el método KVC con objetos que no tienen la propiedad 'theIntegerPropertyToSum' requerida.

Ventaja: Apuesto a que esto simplifica y hace más fáciles las pruebas de rendimiento. Además, cuando alguien más lea tu código en uno o dos años sabrá qué está pasando aquí, si alguna vez han visto una línea del objetivo C o no, esto parece lo que realmente está sucediendo.

+2

Su respuesta implica que no ha usado o leído la documentación en KVC; es posible que desee leer sobre ella antes de decir que no se debe utilizar. En su ejemplo de "objetivo simple C (2)", ¿qué ocurre cuando la Propiedad Integrada aSum no está definida, o un valor de la Propiedad Integrada aSum es -1 y otro es 1.2? ¿Qué pasa si es nulo? –

+0

Uso KVC todo el tiempo: para permitir que la IU se comunique con el código. La desventaja de [theSet valueForKeyPath: @ "@ sum.theIntegerPropertyToSum"] es que es una construcción de lenguaje que no muestra de un vistazo lo que está sucediendo. Cualquier programador de javascript C, C# que vea el enunciado valueForKeyPath no lo entenderá, y será absorbido por una lección que consume mucho tiempo para descubrir qué hace una línea de código. Nunca use construcciones específicas del lenguaje a menos que las necesite. Me recuerda al código STL C++, que es ilegible para todos excepto para los expertos de STL. –

+1

Parece que usa KVO todo el tiempo, no KVC. –

Cuestiones relacionadas