首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何实现NSFastEnumeration协议?

如何实现NSFastEnumeration协议?
EN

Stack Overflow用户
提问于 2011-02-02 17:08:59
回答 2查看 6.9K关注 0票数 22

我有一个班级,我想让我的班级确认NSFastEnumeration协议。我已经看过文档了,但还不是很清楚。有人能告诉我协议方法应该返回什么以及它是如何工作的吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-02-02 17:16:00

苹果的FastEnumerationSample向你展示了该怎么做,但这里有一个细目。

唯一的NSFastEnumeration方法countByEnumeratingWithState:objects:count:返回集合的区块。每当需要更多的项时,它都会执行,直到通过返回0来指示没有更多的项。chunk作为id的C数组传递。

在该方法中,state参数保存了您将使用的大部分(如果不是全部)数据。您需要在每次单独调用countByEnumeratingWithState:objects:count:时设置state->itemsPtr并更新state->state。下面是对NSFastEnumerationState的每个字段的简要描述

  • state:表示被迭代的序列中的位置。对于索引集合,这将是索引。对于链表,这可以是一个节点指针。对于其他类型,这可能是更复杂的类型(例如,对于树,state->state可以是用作存储节点的堆栈的NSMutableArray )。第一次调用countByEnumeratingWithState:objects:count:时,state->state为0;检查此条件以初始化块中的项的state;指向ids的C数组。Cocoa将在此数组上循环,依次将每一项绑定到可变集合的for-in中指定的变量,用于指示自上次调用countByEnumeratingWithState:objects:count:以来集合已更改。通常,在初始化状态时设置一次。集合变更器递增它所指向的值。Cocoa会将countByEnumeratingWithState:objects:count:返回的值与上一次调用的值进行比较;如果两者不同,则Cocoa会抛出一个exception.
  • extra:,您可以用它来存储额外的数据。

您可以将state->statestate->extra的任何元素设置为您想要的任何值;提供它们完全是为了方便您,并且不会影响Cocoa。但是,state->itemsPtr*state->mutationsPtr和该方法返回的值确实会影响Cocoa。

至于另外两个方法参数,stackbuf是Cocoa提供的用来保存项的数组。它的使用是可选的,但如果不使用它,则必须为state->itemPtr分配存储空间。如果使用它,请在每次调用时将state->itemsPtr设置为stackbuflenstackbuf的长度,这是您可以在其中存储的最大项目数。

进一步阅读:

的可可

票数 43
EN

Stack Overflow用户

发布于 2012-02-19 06:26:48

只是在找到一个很好的解释后重新开始这个帖子。与苹果的联系似乎被打破了。你可以在这里试试:https://developer.apple.com/library/ios/#samplecode/FastEnumerationSample/Introduction/Intro.html

我找到的实现快速枚举的最好例子是:http://mikeash.com/pyblog/friday-qa-2010-04-16-implementing-fast-enumeration.html。看起来比实际情况要糟糕得多。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4872509

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档