Apple FastEnumerationSample показывает вам, что делать, но вот разбивка.
Единственный метод NSFastEnumeration
, countByEnumeratingWithState:objects:count:
, возвращает фрагменты коллекции. Он выполняется всякий раз, когда требуется больше элементов, пока он не покажет, что больше нет элементов, возвращая 0. Чанк передается в виде массива C, равного id
s.
В методе параметр state
содержит большую часть (если не все) данных, которые вы будете использовать. Вам нужно будет установить state->itemsPtr
и обновить state->state
при каждом отдельном вызове countByEnumeratingWithState:objects:count:
. Вот краткое описание каждого поля NSFastEnumerationState
:
state
: представляет позицию в итерируемой последовательности. Для индексированных коллекций это будет индекс. Для связанных списков это может быть указатель узла. Для других типов это может быть более сложный тип (например, для дерева state->state
может быть NSMutableArray, используемым в качестве стека для хранения узлов). Когда countByEnumeratingWithState:objects:count:
вызывается впервые, state->state
равен 0; проверьте это условие для инициализации структуры state
.
itemsPtr
: элементы в куске; указывает на массив C id
с. Какао будет зацикливаться на этом массиве, связывая каждый элемент по очереди с переменной, названной в цикле for-in.
mutationsPtr
: для изменяемых коллекций используется для указания того, что коллекция изменилась с момента последнего вызова countByEnumeratingWithState:objects:count:
. Как правило, вы устанавливаете это один раз при инициализации состояния. Мутаторы коллекции увеличивают значение, на которое это указывает. Какао будет сравнивать значение, возвращаемое countByEnumeratingWithState:objects:count:
, со значением из предыдущего вызова; если они разные, какао сгенерирует исключение.
extra
: вы можете использовать это для хранения дополнительных данных.
Вы можете установить state->state
и любой элемент state->extra
на все, что пожелаете; они предоставляются исключительно для вашего удобства и не влияют на какао. state->itemsPtr
, *state->mutationsPtr
и значение, возвращаемое методом, однако, влияет на Какао.
Что касается двух других параметров метода, stackbuf
- это массив, который Cocoa предоставляет для хранения элементов. Его использование не является обязательным, но если вы его не используете, вам придется выделить место для хранения state->itemPtr
. Если вы используете его, установите state->itemsPtr
на stackbuf
при каждом вызове. len
- это длина stackbuf
, максимальное количество предметов, которые вы можете хранить в нем.
Дальнейшее чтение: