2010-08-04 1 views
1

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

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

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

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

Предыстория:

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

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

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

ответ

2

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

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

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

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

+0

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

+0

* Конечно, это означает, что перечислитель будет исчерпан, и вы не сможете его снова зацикливать. Я не могу найти нигде в документах, где говорится, что это правда. – JeremyP

+0

@Jeremy: взгляните на NSEnumerator, который принимает NSFastEnumeration. – kennytm

 Смежные вопросы

  • Нет связанных вопросов^_^