gpt4 book ai didi

iterator - Swift 3 中最小的工作迭代器协议(protocol)/序列

转载 作者:行者123 更新时间:2023-12-03 10:06:35 26 4
gpt4 key购买 nike

我发现很难找到在 Swift 3 中使用 Sequence/IteratorProtocol 的“工作文档”。那里的一些教程/文章似乎是针对较旧的 Swift 的。
想象一个名为 DLList 的玩具双向链表类。 ...

public class Node
{
// whatever "thing" you have a group of, this is that "thing"
}
public class DLList
{
// toy linked list class here
// so this is a group of "node" in this example
}
我相信以下代表最简单(?),正确的方法,总而言之,您可以使用 DLListfor结构体。
第 1 步,使您的 DLList 符合 DLList:Sequence
public class DLList:Sequence
{
// toy linked list class here

public func makeIterator() -> DLListIterator
{
return DLListIterator(self)
}
}
看来您所要做的就是添加 makeIterator称呼。
第二步,编写你的迭代器,符合 IteratorProtocol由于该类是 DLList,我们将其称为 DLListIterator。看起来
1,你必须有一个“init”,它基本上需要有问题的组类
2、你要有一个 next调用,它必须返回与您的组类神奇相关的“事物”之一。
public class DLListIterator:IteratorProtocol
{
var dll:DLList // you must know the group in question
var pointer:Node? // you must know where you are

init(_ dll:DLList)
{
// so note those two items
self.dll = dll
self.pointer = dll.firstOne
}

public func next() -> Node?
{
// return the next one; careful to return nil at end.
let thisOne = self.pointer
self.pointer = self.pointer?.nextOne
return thisOne
}
}
这似乎工作得很好。即,你现在可以走了
var d:DLList = DLList()
for n in d
{
print or whatever n
}
您可以使用 e = d.filter( {d.item blah} )等等 - 太好了。
问题 - 有很多关于 的讨论关联类型 .在第 1 部分中,您是否以某种方式明确声明/添加“关联类型”?即使没有明确要求 你会怎么做 明确地?这种关联类型的业务到底是什么?
问题 - 在第二部分中,我完全迷惑了它是如何“知道”Node 是与 DLList 相关的“事物”。有没有办法明确表示,或者我不明白什么?
敏捷 此外,整个事情似乎不是很Swifty。仅仅为了添加迭代器输出而做所有这些似乎令人难以置信。在 Swift3 中,对于真正的类(class),是否有更快捷的方式? (不是像“倒计时数字”这样的愚蠢例子。)
最后一个问题 我高兴地提到上面现在允许和.filter。事实上,我的例子是否“完整”——我现在可以用 DLList 做所有“迭代器”的事情,在 Swift 中可以正常做——我可能是“忘记了一些功能”还是?在使 DLList 成为一个非常好的迭代器方面还有更多工作要做吗?

最佳答案

这一切都可以通过类型推断很好地工作(在 Swift 中真的很强大)。

例如。 IteratorProtocol只有一个要求,即 next() -> Element?方法。如果您只是 Cmd 并单击 IteratorProtocol,则可以看到以下内容在 XCode 中:

public protocol IteratorProtocol {
associatedtype Element
public mutating func next() -> Self.Element?
}

所以如果你声明一个类型符合 IteratorProtocol并提供一些 next() -> Foo? 的实现然后 Swift 立即推断出 Foo必须是 Element .

当然,您可以通过以下方式进行显式声明:
public class DLListIterator: IteratorProtocol {
public typealias Element = Node

public func next() -> Element? {
// ...
}
}

而且,是的,一旦你同时实现了( SequenceIterator,即),你就可以做其他序列可以做的所有事情。这一切都归功于默认的协议(protocol)实现。

是否为了符合 Sequence 的所有样板您需要提供 makeIterator() ,而这又必须提供 next() ,是 Swifty 还是不是 .. 我认为这更多是基于意见的。有时,您可以实现 Sequence无需实现 IteratorProtocol (例如,当您实现包装器时)。所以, split 对我来说确实有意义。

关于iterator - Swift 3 中最小的工作迭代器协议(protocol)/序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40350731/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com