2009-07-10 13 views
7

Ho pensato che c'era un modo per chiedere rapidamente a NSSet di interrogare i suoi membri e restituire una somma di dire una proprietà NSInteger in ciascuno dei suoi oggetti, ma potrei benissimo confonderlo con il lato Mac OS X delle cose. Esiste in Cococa Touch?Modo rapido per sommare una proprietà di tutti gli oggetti all'interno di un NSSet?

La cosa più vicina che riesco a trovare è objectEnumerator, per cui suppongo di poter frugare tra gli oggetti e incrementare la mia variabile. Esiste la via migliore?

+0

Stai parlando di NSArrayController arrangedObjects. @ Sum. ... cose? Non sono sicuro di come collegarlo con NSSet e come ottenere il conteggio dei membri della classe specifici ... Dovrò leggere su questo. – stefanB

risposta

15

Se stai cercando di trovare la somma di una certa proprietà (theIntegerPropertyToSum) per ogni membro di un/classe di set-derivata array che è KVC-compliant (theSet), è possibile effettuare le seguenti operazioni:

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

Questo è fantastico! Dove, btw, è documentato? Non riesco a trovare nulla dentro/intorno alla definizione di "valueForKeyPath:" nel riferimento del protocollo KVC ... – Meltemi

+0

sono chiamati operatori di raccolta di codifica del valore chiave e il documento è difficile da trovare ... http: // developer .apple.com/library/ios/# documentation/cacao/concettuale/KeyValueCoding/Articoli/CollectionOperators.html –

+0

Questo codice non è di facile manutenzione e confonderà le persone lungo la linea. –

-3

Perché non utilizzare l'obiettivo C (2) normale?

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

Svantaggio: Se vi piace contare le righe, allora questo sembra più a lungo. Ci sono altri svantaggi? Mi chiedo che cosa succede con il metodo KVC con oggetti che non hanno la proprietà 'theIntegerPropertyToSum' richiesta?

Vantaggio: Scommetto che questo debug e test delle prestazioni è più facile. Inoltre, quando qualcun altro legge il tuo codice in un anno o due, sapranno cosa sta succedendo qui - se hanno mai visto una linea dell'obiettivo C o meno, sembra proprio quello che sta realmente accadendo.

+2

La tua risposta implica che non hai usato o letto la documentazione su KVC - potresti volerlo leggere prima di dire che non dovrebbe essere usato. Nell'esempio "obiettivo semplice C (2)", cosa succede quando l'oggetto IntegerPropertyToSum non è definito, oppure un valore dell'IntergerPropertyToSum è -1 e un altro è 1.2? E se fosse nulla? –

+0

Uso sempre KVC - per consentire all'interfaccia utente di comunicare con il codice. Lo svantaggio di [theSet valueForKeyPath: @ "@ sum.theIntegerPropertyToSum"] è un costrutto linguistico che non mostra a colpo d'occhio cosa sta succedendo. Qualsiasi programmatore javascript C, C# che vede l'istruzione valueForKeyPath non lo capirà e sarà risucchiato in una lezione che richiede molto tempo per capire cosa fa una riga di codice. Non usare mai costrutti specifici della lingua se non ne hai bisogno. Mi ricorda il codice STL C++, che è illeggibile per tutti tranne gli esperti di STL. –

+1

Sembra che tu usi sempre KVO, non KVC. –

Problemi correlati