2015-06-14 108 views
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()總是返回第一項。

我該如何避免這種情況?

+0

GeneratorOf已更名AnyGenerator –

回答

1

你行

current = self.Next 

應該

current = current?.Next