【发布时间】:2017-10-30 09:06:01
【问题描述】:
我可以在 Swift 中创建一个生成器吗?
使用迭代器,我需要存储中间结果,例如:
struct Countdown: IteratorProtocol, Sequence {
private var value = 0
init(start: Int) {
self.value = start
}
mutating func next() -> Int? {
let nextNumber = value - 1
if nextNumber < 0 {
return nil
}
value -= 1
return nextNumber
}
}
for i in Countdown(start: 3) {
print(i)
} // print 1 2 3
在这个例子中,我需要存储value。
在我的情况下,我想使用 generator 而不是迭代器,因为我不想将序列的中间结果存储在每个 next 中。
【问题讨论】:
-
您能补充一点描述吗? (我没有对你投反对票。)不了解 Python - 但知道它只是另一种语言 - 我用谷歌搜索了 Python “生成器”是什么。所以现在我明白它是一个简单的迭代循环......好吧,(1) “yield”到底是什么?(2)你想做什么——一般来说,不可知论的语言术语——你想做什么?
-
@dfd 我在 Python 中使用代码,因为我不知道如何表达什么是“产量”和什么是“生成器”。好吧...使用“yield”,您返回到调用生成器的表达式,并在循环结束时返回到最后调用的 yield。如果您不想将中间结果存储在每个迭代器中,这将非常有用——这正是我的情况。无论如何,我编辑了我的问题。
-
Swift 没有“yield”语句或协程,比较stackoverflow.com/questions/43505101/…。
-
这是一个使用线程的仿真:github.com/JadenGeller/Yield(我没有尝试过)。
-
我目前正在制定一项提案,在 Swift 中引入对生成器的语法支持,并寻求对此的反馈。我在这里更详细地描述了它gist.github.com/maxdesiatov/8ae5c0eb747cbda47e641a8e423a1e83