У меня есть класс, и я хочу, чтобы мой класс подтвердил NSFastEnumeration Protocol. Я прочитал документацию, но это не совсем понятно. Может кто-нибудь, пожалуйста, скажите мне, что должен вернуть метод протокола и как он работает? Заранее спасибо.Кто-нибудь знает, как реализовать протокол NSFastEnumeration?
ответ
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
, максимальное количество предметов, которые вы сможете сохранить в нем.
Дальнейшее чтение:
будет заботиться о том, чтобы ссылаться на образец кода, который содержит документированную реализацию, заслуживающую понижающего голосования? ОП никогда не упоминал прочтение образца. автор примерного кода помещает больше времени в пример, чем типичный ответ SO. taaaaanks – justin
две ошибки не дают права ... (т. е. плохой ответ ... за плохой вопрос). я не голосую за вас вверх или вниз, так как этот тип ответа раздражающе распространен. ИМО, следует предположить, что OP всегда читали официальную документацию, и либо есть что-то «за пределами» того, что указано в " официальные документы ", которые могут быть рассмотрены здесь ... или вопрос должен быть отклонен. просто мои $ 0,02. –
@alex нет необходимости предполагать, что OP прочитал документы - это указано в OP. ОП не упомянул о том, что видел образец кода, который объясняет и подробно описывает этот вопрос. в моем ответе мне показалось подходящим, потому что мне пришлось бы перегонять и повторять то, что образец уже объясняет. конечно, эти поля комментариев и новые вопросы можно задать, если потребуется дополнительное разъяснение. учитывая, что ответ был отмечен как решенный, и количество оборотов, вы можете рассмотреть ответ достаточно хорошо, чтобы двигаться в правильном направлении для общего случая. (продолжение) – justin
Просто возрождая эту тему после того, как найти превосходное объяснение. Ссылка 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. Это выглядит намного хуже, чем есть.
- 1. Как реализовать собственный протокол
- 2. Как реализовать протокол
- 3. NSFastEnumeration in Swift 3
- 4. Привязка типа Obj-C, реализующего протокол NSFastEnumeration, к MonoTouch
- 5. Как реализовать многоцелевой протокол сокетов?
- 6. Не удается реализовать протокол
- 7. Возможно ли реализовать NSFastEnumeration при использовании слабых ссылок?
- 8. Реализация NSFastEnumeration в пользовательском классе
- 9. NSFastEnumeration object casting in ARC
- 10. NSFastEnumeration in Swift
- 11. Правильная конструкция класса NSFastEnumeration
- 12. Пользовательский метод NSFastEnumeration?
- 13. Как написать (реализовать) Сетевой протокол прикладного уровня
- 14. Как реализовать протокол в целом с категорией?
- 15. как реализовать протокол aodv в ns2
- 16. Как реализовать протокол activesync в приложении iphone?
- 17. Как реализовать протокол HTTP с помощью WebRTC?
- 18. Как реализовать этот протокол в struct
- 19. Как избежать класса импорта и реализовать протокол?
- 20. Как бы реализовать этот протокол быстро?
- 21. Как пирамида знает, какой протокол отображать на request.static_url?
- 22. реализовать протокол с другим связанным типом
- 23. Реализовать Objective-C протокол в быстром
- 24. Реализовать IAP2 (протокол MFi) на raspberryPi
- 25. Попытка реализовать протокол ObjectiveC в Swift
- 26. как реализовать протокол, как я сделал в андроида
- 27. Swift, как реализовать протокол Hashable на основе ссылки на объект?
- 28. Как правильно реализовать Equatable протокол в иерархии классов?
- 29. Определить объект как «Тип» класса и реализовать протокол
- 30. Как реализовать протокол sntp или ntp для любой встроенной платы
Возможный дубликат [Надлежащая конструкция класса NSFastEnumeration] (http://stackoverflow.com/questions/3468349/proper-construction-of-nsfastenumeration-class) – outis