8.9.4 Протокол быстрой перечисления
Если вы хотите, чтобы ваш собственный объект коллекции можно было использовать с быстрой перечислением, вам нужно реализовать метод
- (unsigned long) countByEnumeratingWithState: (NSFastEnumerationState *)state
objects: (id *)objects
count: (unsigned long)len;
где NSFastEnumerationState должен быть определен в вашем коде следующим образом:
typedef struct
{
unsigned long state;
id *itemsPtr;
unsigned long *mutationsPtr;
unsigned long extra[5];
} NSFastEnumerationState;
Если NSFastEnumerationState не определен в вашем коде, компилятор автоматически заменит NSFastEnumerationState * на struct __objcFastEnumerationState *, где этот тип неявно определен компилятором аналогичным образом. Это может быть запутанно, и мы рекомендуем определить NSFastEnumerationState (как показано выше) вместо этого.
Метод вызывается многократно во время быстрой перечисления для получения партий объектов. Каждый вызов метода должен возвращать следующую партию объектов.
Значение возвращаемого методом является количеством объектов в текущей партии; это не должно превышать len, что является максимальным размером партии, запрошенным вызывающим объектом. Сама партия возвращается в поле itemsPtr структуры NSFastEnumerationState.
Для помощи в возврате объектов массив objects — это предварительно выделенный вызывающим объектом (в стеке) массив С размером len. Во многих случаях вы можете поместить объекты, которые хотите вернуть, в этот массив objects, а затем выполнить itemsPtr = objects. Но вы не обязаны; если ваша коллекция уже содержит объекты для возврата в виде массива С, она может вернуть их оттуда вместо этого.
Поля state и extra структуры NSFastEnumerationState позволяют вашему объекту коллекции отслеживать состояние перечисления. В простой реализации массива state может отслеживать индекс последнего возвращенного объекта, а extra может быть неиспользуемым.
Поле mutationsPtr структуры NSFastEnumerationState используется для отслеживания изменений. Оно должно указывать на число; перед обработкой каждого объекта цикл быстрой перечисления проверит, не изменилось ли это число. Если изменилось, произошла мутация, и быстрая перечисление прервется. Таким образом, mutationsPtr можно установить для указания на некоторую версию вашей коллекции, которая увеличивается на единицу каждый раз, когда происходит изменение (например, при добавлении или удалении объекта). Или, если вы довольны менее строгими проверками мутаций, он может указывать на количество объектов в вашей коллекции или другое значение, которое можно проверить, чтобы приблизительно проверить, не была ли коллекция изменена.
Наконец, обратите внимание, как мы объявили аргумент len и значение возврата типа unsigned long. Они также могли быть объявлены типа unsigned int, и все равно все работало бы.
Предыдущий: Подробности быстрой перечисления, Вверх: Быстрое перечисление [Оглавление][Индекс]
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-7.5.0/gcc/Fast-enumeration-protocol.html