Swift中的Iterator <int>

时间:2018-07-15 21:04:53

标签: swift iterator

我正在迅速写一个特里。我已经在Java中编写了相同的代码,其中我接受Iterator<Int>的实例作为参数来指定trie元素的位置。

我很快找不到相同的简单界面。 表格

public func put(path: Iterator<Int>) {...}

public func put(path: IteratorProtocol<Int>) {...}

给我编译错误,所以我目前正在使用

public func put(path: AnyIterator<Int>) {...}

但这看起来很丑陋,并迫使调用者创建一个额外的任意对象。有没有更好的办法?我不敢相信swift没有优雅的习语.....我只是找不到它。

2 个答案:

答案 0 :(得分:2)

Iterator的等效项是Sequence。

func put<S: Sequence>(path: S) where S.Element == Int

如果您不关心元素的类型,当然不需要where子句。

通常,特里树本身在其自身的Element上是通用的,因此它会像

struct Trie<Element: Comparable> {
    func put<S: Sequence>(path: S) where S.Element == Element { ... }
}

如果您真的想直接接受迭代器,则可以,但是这种情况很少见。就是这样:

func put<I: IteratorProtocol>(path: inout I) where I.Element == Int

要直接使用迭代器,您需要对其进行修改,这意味着您需要将其设为inout(或者可以返回它的一个副本,但是由于前进一个副本的多个副本可能会很危险。迭代器未定义)。但是,这确实很不寻常。您可能是说Sequence

答案 1 :(得分:0)

尝试了Rob Napier建议的功能签名,并且遇到了一些问题,我已经实现了自己的协议:

public protocol PathIterator { func next() -> Int? }

以及包装String或[Int]的一些具体实现。我仍然想找出如何快速地做到这一点,但是我更热衷于编写代码并发挥作用。我仍然愿意接受建议。