Методы, основанные на NSEnumerator, когда-то были единственным поддерживаемым способом перечисления. Я не могу думать ни о каких преимуществах, которые он имеет по сравнению с другими - он медленнее и громоздче, и его в значительной степени заменили другие методы.
Использование блоков обеспечивает большую гибкость. Метод может принять блок в качестве аргумента и использовать его для перечисления нескольких различных коллекций:
- (void) doSomethingToFruits:(void(^)(id,NSUInteger,BOOL*))block
{
[apples enumerateObjectsUsingBlock:block];
[bananas enumerateObjectsUsingBlock:block];
[kiwis enumerateObjectsUsingBlock:block];
}
Вы также можете использовать аргумент параметров в enumerateObjectsUsingBlock:options:
для одновременного перечисления содержимого.
Что мне нравится в быстром перечислении, так это то, что протокол NSFastEnumeration позволяет мне добавлять метод, который принимает либо массивы или наборы (или хеш-таблицы, либо что-то еще), но все еще имеет проверку статического типа в аргументе:
- (void) addObjectsFromCollection:(id<NSFastEnumeration>)coll
{
for (id obj in coll) [self addObject:obj];
}
В противном случае, синтаксис этих двух, кажется, лучше подходит в разных контекстах. Я обнаружил, что если основная часть метода перечисляет коллекцию, то становится яснее, что происходит, если я использую быстрое перечисление, тогда как если я просто хочу выполнить одно или два действия со всем содержимым в середине более крупного метода, блоки более краткие, но я думаю, что эта часть зависит от личных предпочтений.
Добавление:
Если вы хотите отслеживать индекс, опция блока принимает индекс в качестве аргумента.