我有一个班级,我希望我的班级确认NSFastEnumeration协议。我已阅读文档,但不是很清楚。有人可以告诉我协议方法应该返回什么以及它是如何工作的?
答案 0 :(得分:42)
Apple的FastEnumerationSample向您展示了该怎么做,但这是一个细分。
唯一的NSFastEnumeration
方法countByEnumeratingWithState:objects:count:
返回集合的块。只要需要更多项目,就会执行它,直到它通过返回0指示没有更多项目。一个块作为id
的C数组传递。
在该方法中,state
参数包含您将使用的大部分(如果不是全部)数据。您需要设置state->itemsPtr
并在每次单独调用state->state
时更新countByEnumeratingWithState:objects:count:
。以下是NSFastEnumerationState
的每个字段的简要说明:
state
:表示迭代序列中的位置。对于索引集合,这将是索引。对于链表,这可以是节点指针。对于其他类型,这可能是更复杂的类型(例如,对于树,state->state
可以是用作存储节点的堆栈的NSMutableArray)。首次调用countByEnumeratingWithState:objects:count:
时,state->state
为0;检查此条件以初始化state
结构。itemsPtr
:块中的项目;指向id
的C数组。 Cocoa将遍历此数组,依次将每个项绑定到for-in循环中命名的变量。mutationsPtr
:用于可变集合,用于表示自上次调用countByEnumeratingWithState:objects:count:
以来集合已更改。通常,在初始化状态时,您需要设置一次。集合mutators增加了它指向的值。 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
的长度,是您可以在其中存储的最大商品数。
进一步阅读:
答案 1 :(得分: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。它看起来比现在糟糕得多。