Как реализовать протокол NSFastEnumeration? - PullRequest
21 голосов
/ 02 февраля 2011

У меня есть класс, и я хочу, чтобы мой класс подтвердил протокол NSFastEnumeration. Я прочитал документацию, но она не совсем понятна. Может кто-нибудь подсказать, пожалуйста, какой метод протокола должен возвращаться и как он работает?

Ответы [ 2 ]

42 голосов
/ 02 февраля 2011

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, максимальное количество предметов, которые вы можете хранить в нем.

Дальнейшее чтение:

3 голосов
/ 19 февраля 2012

Просто возрождаю эту тему после нахождения отличного объяснения.Ссылка Apple, кажется, не работает.Вы можете попробовать здесь: https://developer.apple.com/library/ios/#samplecode/FastEnumerationSample/Introduction/Intro.html

Лучший пример для реализации быстрого перечисления, который я нашел, находится по адресу: http://mikeash.com/pyblog/friday-qa-2010-04-16-implementing-fast-enumeration.html. Это выглядит намного хуже, чем есть.

...