1
我嘗試瞭解發電機和序列使我實現我自己的列表數據結構的想法和執行協議,以使用forIn循環。我的代碼:自定義列表數據結構實現序列類型使用GeneratorOf結構
class GSList<T> : SequenceType
{
var Next : GSList<T>?
var Value : T
init(_ value: T, next : GSList<T>?)
{
self.Value = value
self.Next = next
}
func add(list: GSList<T>)
{
if (self.Next != nil)
{
self.Next?.add(list)
} else
{
self.Next = list
}
}
typealias Generator = GeneratorOf<GSList<T>>
func generate() -> Generator
{
var current: GSList<T>? = self
println(current?.Value)
return GeneratorOf
{() -> GSList<T>? in
let returnValue = current
current = self.Next
println(self.Value)
println(current?.Value)
return returnValue
}
}
}
var list1 = GSList(1, next: nil)
var list2 = GSList(2, next: nil)
var list3 = GSList(3, next: nil)
var list4 = GSList(4, next: nil)
var list5 = GSList(5, next: nil)
list1.add(list2)
list1.add(list3)
list1.add(list4)
list1.add(list5)
var generator = list1.generate()
generator.next()
generator.next()
generator.next()
generator.next()
generator.next()
它沒有任何編譯時錯誤,但問題是,在generate()
方法current
變量不會更新與Next
值:
func generate() -> Generator
{
var current: GSList<T>? = self
println(current?.Value)
return GeneratorOf
{() -> GSList<T>? in
let returnValue = current
current = self.Next
println(self.Value)
println(current?.Value)
return returnValue
}
}
於是打電話給下一generator.next()
總是返回第一項。
我該如何避免這種情況?
GeneratorOf已更名AnyGenerator –