Spec-Zone.ru › GCC 9

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-9.5.0/gcc/Fast-enumeration-protocol.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API