22

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

4

2 回答 2

43

Apple 的FastEnumerationSample向您展示了该怎么做,但这里有一个细分。

唯一的NSFastEnumeration方法,countByEnumeratingWithState:objects:count:返回集合的块。它在需要更多项目时执行,直到它通过返回 0 指示没有更多项目。块作为ids 的 C 数组传递。

在该方法中,state参数包含您将使用的大部分(如果不是全部)数据。您需要在state->itemsPtr每次state->state单独调用countByEnumeratingWithState:objects:count:. 以下是 的每个字段的简要说明NSFastEnumerationState

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

您可以根据需要设置state->state任何元素state->extra;它们只是为了您的方便而提供,不会影响 Cocoa。state->itemsPtr*state->mutationsPtr但是该方法返回的值确实会影响 Cocoa。

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

进一步阅读:

于 2011-02-02T09:16:00.093 回答
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。它看起来比实际情况要糟糕得多。

于 2012-02-18T22:26:48.100 回答