Быстрый способ суммировать свойства всех объектов в NSSet?

Я думал, что есть способ быстро попросить NSSet опросить своих членов и вернуть сумму, скажем, свойства NSInteger в каждом из его объектов, но я вполне могу спутать это со стороной Mac OS X. Существует ли это в Cococa Touch?

Самое близкое, что я могу найти, это objectEnumerator, с помощью которого, я полагаю, я мог бы просмотреть каждый объект и увеличить свою собственную переменную. Существует ли лучший способ?


person Meltemi    schedule 10.07.2009    source источник
comment
Вы говорите о NSArrayController аранжированныхОбъектах. @sum. ... вещи? Я не уверен, как связать его с NSSet и как получить количество конкретных членов класса... Я почитаю об этом.   -  person stefanB    schedule 10.07.2009


Ответы (2)


Если вы пытаетесь найти сумму заданного свойства (theIntegerPropertyToSum) для каждого члена класса, производного от массива/множества, который совместим с KVC (theSet), вы можете сделать следующее:

NSNumber* theSum = [theSet valueForKeyPath:@"@sum.theIntegerPropertyToSum"];
person Nathan de Vries    schedule 10.07.2009
comment
Это замечательно! Где, кстати, это задокументировано? Кажется, я не могу найти ничего в/вокруг определения valueForKeyPath: в справочнике по протоколу KVC... - person Meltemi; 15.07.2009
comment
они называются операторами коллекции кодирования ключевого значения, и документ трудно найти... developer.apple.com/library/ios/#documentation/cocoa/conceptual/ - person Grady Player; 26.01.2013
comment
Этот код не удобен в сопровождении и может запутать людей в будущем. - person Tom Andersen; 28.01.2013
comment
Это замечательная функция Objective C. В C++ этого сделать нельзя. - person fnc12; 24.08.2014

Почему бы не использовать простой объектив C (2)?

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

Недостаток: если вам нравится считать строки, то это выглядит длиннее. Есть ли другие недостатки - интересно, что происходит с методом KVC с объектами, у которых нет требуемого свойства 'theIntegerPropertyToSum'?

Преимущество: я бы поспорил, что это упрощает отладку и тестирование производительности. К тому же, когда кто-то прочтет ваш код через год или два, он будет знать, что здесь происходит — независимо от того, видели ли они когда-нибудь строку на языке C или нет, похоже, что это происходит на самом деле.

person Tom Andersen    schedule 10.07.2009
comment
Ваш ответ подразумевает, что вы не использовали или не читали документацию по KVC - вы можете прочитать об этом, прежде чем сказать, что его не следует использовать. В вашем примере с простой задачей C (2), что происходит, когда свойствоIntegerPropertyToSum не определено или одно значение свойстваIntegerPropertyToSum равно -1, а другое равно 1,2? А если ноль? - person Nathan de Vries; 10.07.2009
comment
Я использую KVC все время — чтобы пользовательский интерфейс взаимодействовал с кодом. Недостатком [theSet valueForKeyPath:@@sum.theIntegerPropertyToSum] является то, что это языковая конструкция, которая не показывает с первого взгляда, что происходит. Любой программист javascript C, C#, увидев оператор valueForKeyPath, не поймет его и будет втянут в трудоемкий урок, чтобы выяснить, что делает одна строка кода. Никогда не используйте специфичные для языка конструкции, если они вам не нужны. Напоминает мне код STL C++, который не читается всеми, кроме специалистов по STL. - person Tom Andersen; 11.07.2009
comment
Похоже, вы все время используете KVO, а не KVC. - person Nathan de Vries; 12.07.2009
comment
Никогда не используйте специфичные для языка конструкции, если они вам не нужны.?! Это самая глупая вещь, которую я слышал за всю неделю. Конечно, зачем вообще чему-то учиться? (Кстати, программист на C тоже не узнает, что такое ваш цикл быстрого перечисления for.) (Кроме того, KVC — это функция фреймворка, а не языка — обратите внимание, что аргумент — это просто старая обычная строка.) - person jscs; 26.01.2013