在Swift中实现可枚举/集合类

时间:2014-08-14 04:30:49

标签: swift

我正在尝试实现类(实现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中实现可迭代类的正确方法是什么?

1 个答案:

答案 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
    }
}