我有一个班级,我希望我的班级确认 NSFastEnumeration 协议。我已经阅读了文档,但不是很清楚。有人可以告诉我协议方法应该返回什么以及它是如何工作的吗?
2 回答
Apple 的FastEnumerationSample向您展示了该怎么做,但这里有一个细分。
唯一的NSFastEnumeration
方法,countByEnumeratingWithState:objects:count:
返回集合的块。它在需要更多项目时执行,直到它通过返回 0 指示没有更多项目。块作为id
s 的 C 数组传递。
在该方法中,state
参数包含您将使用的大部分(如果不是全部)数据。您需要在state->itemsPtr
每次state->state
单独调用countByEnumeratingWithState:objects:count:
. 以下是 的每个字段的简要说明NSFastEnumerationState
:
state
: 表示被迭代的序列中的位置。对于索引集合,这将是索引。对于链表,这可能是一个节点指针。对于其他类型,这可能是更复杂的类型(例如,对于树,state->state
可能是用作堆栈以存储节点的 NSMutableArray)。countByEnumeratingWithState:objects:count:
首次调用时,为state->state
0;检查此条件以初始化state
结构。itemsPtr
:块中的项目;指向id
s 的 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
为。是 的长度,您可以在其中存储的最大项目数。stackbuf
len
stackbuf
进一步阅读:
- 周五问答 2010-04-16:实施快速枚举(mikeash.com)
- 实现 countByEnumeratingWithState:objects:count: (Cocoa with Love)
- NSFastEnumeration 协议参考
- 在自定义类(SO)上实现 NSFastEnumerator
在找到一个很好的解释后才恢复这个线程。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。它看起来比实际情况要糟糕得多。