Как реализовать протокол NSFastEnumeration?

Еще легче:

for c in "test":
    print c
22
задан Cœur 6 December 2018 в 13:38
поделиться

1 ответ

Образец Apple FastEnumerationSample показывает вам, что делать, но вот разбивка.

Единственный метод NSFastEnumeration, countByEnumeratingWithState:objects:count:, возвращает фрагменты коллекции. Он выполняется всякий раз, когда требуется больше элементов, пока он не укажет, что больше нет элементов, возвращая 0. Чанк передается как массив C из id с.

В методе параметр 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 является массивом, который Какао предоставляет для хранения элементов. Его использование не является обязательным, но если вы его не используете, вам придется выделить место для хранения state->itemPtr. Если вы используете его, установите state->itemsPtr в stackbuf при каждом вызове. len - это длина stackbuf, максимальное количество предметов, которые вы сможете сохранить в нем.

Дополнительное чтение:

43
ответ дан 29 November 2019 в 04:25
поделиться