我正在迅速写一个特里。我已经在Java中编写了相同的代码,其中我接受Iterator<Int>
的实例作为参数来指定trie元素的位置。
我很快找不到相同的简单界面。 表格
public func put(path: Iterator<Int>) {...}
和
public func put(path: IteratorProtocol<Int>) {...}
给我编译错误,所以我目前正在使用
public func put(path: AnyIterator<Int>) {...}
但这看起来很丑陋,并迫使调用者创建一个额外的任意对象。有没有更好的办法?我不敢相信swift没有优雅的习语.....我只是找不到它。
答案 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]的一些具体实现。我仍然想找出如何快速地做到这一点,但是我更热衷于编写代码并发挥作用。我仍然愿意接受建议。