【问题标题】:How to implement the NSFastEnumeration protocol?如何实现 NSFastEnumeration 协议?
【发布时间】:2011-06-19 20:10:04
【问题描述】:

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

【问题讨论】:

标签: objective-c cocoa fast-enumeration


【解决方案1】:

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

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

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

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

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

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

进一步阅读:

【讨论】:

  • 投反对票的人是否愿意解释为什么引用包含文档实现的示例代码值得投反对票? OP从未提及阅读示例。示例代码的作者在示例中投入的时间比典型的 SO 答案更多。 taaaanks
  • 两个错误不代表正确......(即一个错误的答案......对于一个糟糕的问题)。我不会对你投赞成票或反对票,因为这种类型的答案令人讨厌地普遍存在.. IMO,应该假设 OP 已经阅读了官方文档,总是,并且要么有一些“超出”的东西在“官方文档” - 可以在这里详细说明……或者这个问题应该被否决。只是我的 $.02。
  • @alex 没有必要假设 OP 已经阅读了文档——这在 OP 中有说明。 OP 没有提到看过示例代码,该代码很好地解释和详细说明了这个主题。我的回答简洁明了,因为我不得不提炼并重复样本已经解释的内容。当然,如果需要进一步澄清,可以询问这些评论字段和新问题。考虑到答案被标记为已解决,并且赞成票的数量,您可能会认为答案足以推动一般情况下的正确方向。 (续)
  • (cont) SO 不需要成为 Apple 在文档、示例和视频中发布的所有内容的独立替代品。为什么不必要地重复工作?
  • @Justin:不是反对者,但我认为这是因为answers consisting solely of a link 不鼓励这样做。取而代之的是,将链接页面提炼为答案中的基本要素。
【解决方案2】:

在找到一个很好的解释后才恢复这个线程。 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。它看起来比实际更糟糕。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多