подсчитать элементы внутри id ‹NSFastEnumeration›

У меня есть id<NSFastEnumeration> объект. Я хочу посчитать элементы внутри объекта. Как этого достичь?

Единственный метод, который реализует NSFastEnumeration:

- (NSUInteger)countByEnumeratingWithState:(NSFastEnumerationState *)state objects:(id *)stackbuf count:(NSUInteger)len

Этот метод возвращает количество, которое я ищу, но поскольку я не хочу действительно перечислять объекты, которые мне интересно, что я мог бы безопасно передать в качестве аргументов. Можно ли просто передать nil, nil, 0? Если нет, что я должен пройти?

Фон:

Я хочу создать NSArray возвращаемых значений функции, которую я хочу вызывать с каждым элементом в данной коллекции. Мне нужен массив результатов перечисления коллекции с помощью функции.

id<NSFastEnumeration> enumeratable = someObject;
NSMutableArray* results = [NSMutableArray arrayWithCapacity:(#Fill in count here#)];
for (id object in enumeratable) {
    [results addObject:callFunctionOnObject(object)];
}

Как видите, мне нужен только счетчик для оптимизации инициализации массива. Я прекрасно понимаю, что мог бы использовать вместо этого NSMutableArray* results = [NSMutableArray array];.


person tonklon    schedule 04.08.2010    source источник


Ответы (1)


Единственный способ получить длину из NSFastEnumeration - пройти через него.

int count = 0;
for (id x in enumerator)
  ++ count;
return count;

Конечно, это означает, что enumerator будет исчерпан, и вы не сможете зациклить его снова.

Кроме того, емкость - это всего лишь подсказка. В его настройке мало пользы.

person kennytm    schedule 04.08.2010
comment
Спасибо за Ваш ответ. Я знаю, что емкость - это всего лишь намек, но потом мне стало любопытно, и я захотел узнать. Тогда я буду придерживаться NSMutableArray* results = [NSMutableArray array];. - person tonklon; 04.08.2010
comment
Конечно, это означает, что счетчик будет исчерпан, и вы не сможете зациклить его снова. Неужели? Я не могу найти нигде в документации, где говорится, что это правда. - person JeremyP; 04.08.2010
comment
@Jeremy: Взгляните на NSEnumerator, который принимает NSFastEnumeration. - person kennytm; 04.08.2010
comment
TM: Я просмотрел документацию NSEnumerator, но там не сказано, что использование for(... in ...) в перечислителе истощает счетчик. Однако я попробовал и обнаружил, что это правда. - person JeremyP; 04.08.2010