迅速。 GeneratorOf <t>生成函数不返回正确的生成器

时间:2015-06-02 12:42:45

标签: ios swift generator sequence

我使用游乐场玩序列和生成器。 所以我创建了一个返回GeneratorOf结构的函数,该结构假设实现了GeneratorType和SequenceType。我希望generate会给我一个新的完整的生成器,我可以再次遍历。但它没有为我的countDownGen2。

我想我误解了一些事情。

这里有什么问题?以及如何正确使用GeneratorOf?

func countDown(start: Int) -> GeneratorOf<Int>
{
    var i = start
    return GeneratorOf {return i < 0 ? nil : i-- }
}

var countDownGen = countDown(10)

for i in countDownGen
{
    println(i)
}

var countDownGen2 = countDownGen.generate()

for i in countDownGen2
{
    println(i)
}

1 个答案:

答案 0 :(得分:3)

GeneratorOf<T>.generate() returns a copy of itself,在您的代码中,每个副本与一个i

共享相同的引用

因此,当countDownGen2 = countDownGen.generate()用尽后countDownGen时,countDownGen2也已用尽。

你应该做的是:

func countDown(start: Int) -> SequenceOf<Int> {
    return SequenceOf { () -> GeneratorOf<Int> in
        var i = start
        return GeneratorOf { return i < 0 ? nil : i-- }
    }
}

let countDownSeq = countDown(10)

for i in countDownSeq {
    println(i)
}

for i in countDownSeq {
    println(i)
}

let countDownSeq2 = countDownSeq

for i in countDownSeq2 {
    println(i)
}