我正在尝试实现类(实现SequenceType),它似乎比我期望的有点复杂。在C#中我只需要实现IEnumerable
和“yield return
”使其变得非常简单。在使用__iter__()
和yield
的python中也是如此。但在斯威夫特,我不知道为什么它过于复杂。
这是代码
class Nums : SequenceType{
let list = [1,2,3,4,5]
func generate() -> GeneratorOf<Int?> {
return GeneratorOf<Int?>{
for i in self.list{
return i
}
return nil
}
}
}
当我在for-in
中调用它时,它会进入无限循环。
在swift中实现可迭代类的正确方法是什么?
答案 0 :(得分:9)
return
与C#,Python和其他语言中的yield
不同。它只是一个简单的return
声明。
相反,Swift生成器使用可选的vaules - Some(x)
表示序列中的下一个项目,None
(或nil
)表示序列的结束。
传递给GeneratorOf<Int>
构造函数的块(顺便说一下,不需要使用Int?
)将在每一步中调用,并且应该生成每次调用时的下一个值,或者nil
完成后的值。因此,您可以使用可变变量来跟踪状态:
func generate() -> GeneratorOf<Int>
{
var i = 0
return GeneratorOf<Int> {
if i >= self.list.count { return nil }
return self.list[i++]
}
}
或者您甚至可以使用list
的内置生成器:
func generate() -> GeneratorOf<Int>
{
var g = self.list.generate()
return GeneratorOf<Int> {
return g.next() // not very exciting... we might as well have returned g itself
}
}