我使用 Playground 来玩一些序列和生成器。 所以我创建了返回 GeneratorOf 结构的函数,该结构假设实现 GeneratorType 和 SequenceType。我希望生成会给我一个新的完整生成器,我可以再次遍历它。但我的 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)
}
最佳答案
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)
}
关于ios - swift 。 GeneratorOf<T> 生成函数未返回正确的生成器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30596447/