2011-02-02 2 views
20

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

+0

Возможный дубликат [Надлежащая конструкция класса NSFastEnumeration] (http://stackoverflow.com/questions/3468349/proper-construction-of-nsfastenumeration-class) – outis

ответ

41

Apple's 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:. Как правило, вы устанавливаете это один раз при инициализации состояния. Мутаторы коллекции увеличивают значение, на которое это указывает. Cocoa сравнивает значение, возвращаемое countByEnumeratingWithState:objects:count:, с значением из предыдущего вызова; если они разные, Cocoa выдаст исключение.
  • extra: вы можете использовать это, чтобы хранить дополнительные данные.

Вы можете установить state->state и любой элемент state->extra на все, что пожелаете; они предоставляются исключительно для вашего удобства и не влияют на Cocoa. state->itemsPtr, *state->mutationsPtr и значение, возвращаемое методом, однако, влияют на Cocoa.

Что касается двух других параметров метода, stackbuf - это массив, который Cocoa предоставляет для хранения элементов. Его использование является необязательным, но если вы его не используете, вам придется выделить место для хранения state->itemPtr. Если вы используете его, установите state->itemsPtr в stackbuf с каждым вызовом. len - это длина stackbuf, максимальное количество предметов, которые вы сможете сохранить в нем.

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

+0

будет заботиться о том, чтобы ссылаться на образец кода, который содержит документированную реализацию, заслуживающую понижающего голосования? ОП никогда не упоминал прочтение образца. автор примерного кода помещает больше времени в пример, чем типичный ответ SO. taaaaanks – justin

+0

две ошибки не дают права ... (т. е. плохой ответ ... за плохой вопрос). я не голосую за вас вверх или вниз, так как этот тип ответа раздражающе распространен. ИМО, следует предположить, что OP всегда читали официальную документацию, и либо есть что-то «за пределами» того, что указано в " официальные документы ", которые могут быть рассмотрены здесь ... или вопрос должен быть отклонен. просто мои $ 0,02. –

+0

@alex нет необходимости предполагать, что OP прочитал документы - это указано в OP. ОП не упомянул о том, что видел образец кода, который объясняет и подробно описывает этот вопрос. в моем ответе мне показалось подходящим, потому что мне пришлось бы перегонять и повторять то, что образец уже объясняет. конечно, эти поля комментариев и новые вопросы можно задать, если потребуется дополнительное разъяснение. учитывая, что ответ был отмечен как решенный, и количество оборотов, вы можете рассмотреть ответ достаточно хорошо, чтобы двигаться в правильном направлении для общего случая. (продолжение) – justin

3

Просто возрождая эту тему после того, как найти превосходное объяснение. Ссылка 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. Это выглядит намного хуже, чем есть.

Смежные вопросы