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 представляет собой предварительно выделенный вызывающим объектом (в стеке) массив C размером len. Во многих случаях вы можете поместить возвращаемые объекты в этот массив objects, а затем выполнить itemsPtr = objects. Но это не обязательно; если ваша коллекция уже содержит объекты для возврата в виде массива C, она может вернуть их оттуда вместо этого.
Поля 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-8.5.0/gcc/Fast-enumeration-protocol.html