Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 迭代器<;Int>;迅速地_Swift_Iterator - Fatal编程技术网

Swift 迭代器<;Int>;迅速地

Swift 迭代器<;Int>;迅速地,swift,iterator,Swift,Iterator,我正在用swift写一篇文章。我用java编写了相同的代码,在java中我接受一个Iterator实例作为参数来指定trie元素的位置 在swift中,我找不到相同的简单界面。 表格 public func put(路径:迭代器){…} 及 public func put(路径:IteratorProtocol){…} 给我编译错误,所以我目前正在使用 public func put(路径:AnyIterator){…} 但这看起来很难看,并迫使调用方创建一个额外的任意对象。有更好的办法吗?我不

我正在用swift写一篇文章。我用java编写了相同的代码,在java中我接受一个
Iterator
实例作为参数来指定trie元素的位置

在swift中,我找不到相同的简单界面。 表格

public func put(路径:迭代器){…}

public func put(路径:IteratorProtocol){…}

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

public func put(路径:AnyIterator){…}


但这看起来很难看,并迫使调用方创建一个额外的任意对象。有更好的办法吗?我不敢相信斯威夫特没有一个优雅的成语。。。。。我就是找不到它。

迭代器的等价物是序列

func put<S: Sequence>(path: S) where S.Element == Int
如果你真的想直接接受迭代器,你可以,但这是非常罕见的。这将遵循以下思路:

func put<I: IteratorProtocol>(path: inout I) where I.Element == Int
func put(路径:inout I),其中I.Element==Int

要直接使用迭代器,您需要对其进行修改,这意味着您需要它是
inout
(或者您可以返回迭代器的一个副本,但可能很危险,因为未定义迭代器的多个副本)。不过,这真的很不寻常。你可能是说,我尝试了Rob Napier建议的函数签名,遇到了问题,我实现了自己的协议:

公共协议路径迭代器{
func next()->Int?
}


以及一些包装字符串或[Int]的具体实现。我仍然希望了解如何以快速的方式完成这项工作,但我更希望代码能够被编写和运行。我仍然愿意接受建议。

这将是Java的实践。为什么要求调用方为您调用
iterator()
?您应该接受一个
收集器
列表
@Alexander:谢谢您的评论,我听到了您的意见,但是整数序列定义了元素在树/trie中的位置。trie在每个节点上都被遍历,因此集合还需要携带一个偏移量到集合中,使其成为一个特殊对象。迭代器通过释放一个整数序列并跟踪下一个整数来完成这项工作。非常适合这份工作。整数的来源可以是任何东西,甚至是字符串,因此迭代器方法似乎是调用方的最低要求。使用迭代器是一个实现细节,我认为应该封装在类型中,不要通过公共API公开它。@Alexander:听起来不错,但我不确定什么会取代接口中的迭代器。树/trie中的位置由一系列整数定义,这些整数在导航树时使用。可以将其视为“映射”的“键”,其中值是可以保存用户数据的trie元素。任何其他数据结构都会受到更严格的限制。我在bitbucket上有swift和java两个版本,并欢迎关于重新构建接口的建议。我已经说过了。谢谢——这正是我需要的。迭代器语法很难看,但这就是第一章。我需要一个迭代器,因为trie中的每个元素都基于下一个整数确定/创建一个子元素,然后将迭代器传递给该子元素。我在哪里可以读到更多关于这个语法的内容?我觉得它有点不透明。trie是泛型的,但是整数“path”是导航trie/树的方法。低级实现只处理结构,但每个节点都可以携带一个generic用户值。我仍在分析细节,但这里有一些代码[
func put<I: IteratorProtocol>(path: inout I) where I.Element == Int