2014-09-12 72 views
0

我試圖在Swift中實現Stack結構並使其符合GeneratorSequence從Swift擴展中訪問存儲的結構屬性

class Stack<T> { 
    var items:Array<T> 

    var depth : Int{ return items.count} 



    init(){ 
     items = Array<T>() 
    } 

    func push(elm:T){ 
     items += elm 
    } 

    func pop()->T?{ 
     if depth > 0{ 
      return items.removeLast() 
     }else{ 
      return nil 
     } 
    } 
} 

當試圖使其符合Generator時,我遇到了麻煩。我試圖通過擴展添加一個嵌套的類型,當我得到一個錯誤這就是:

extension Stack{ 

    struct StackGenerator: Generator{ 

     var current = 0 
     mutating func next() -> T?{ 
      let rc = items[current] // Get an error here: can't access items in Stack 

     } 
    } 
} 

編譯器不會讓我內StackGenerator訪問Stack.items物業形態。這是預期的嗎?我該如何解決這個問題?

+0

和Xcode 6 GM,你有來取代'項目+ = elm':'項目+ = [榆]'。 – 2014-09-12 14:03:05

回答

1

泛型類型不能有嵌套類 - 你需要完成構建StackGenerator以外的Stack聲明,或在您的generate功能使用GeneratorOf<T>類型。

第一個選項看起來是這樣的:

class Stack<T> : SequenceType { 
    var items: Array<T> 
    var depth: Int { return items.count } 

    init(){ 
     items = Array<T>() 
    } 

    func push(elm:T){ 
     items += [elm] 
    } 

    func pop()->T?{ 
     if depth > 0 { 
      return items.removeLast() 
     } else { 
      return nil 
     } 
    } 

    func generate() -> StackGenerator<T> { 
     return StackGenerator(stack: self) 
    } 
} 

struct StackGenerator<T>: GeneratorType { 
    typealias Element = T 
    var current = 0 
    var stack: Stack<T> 

    init (stack: Stack<T>) { 
     self.stack = stack 
    } 

    mutating func next() -> T? { 
     if current < self.stack.items.count { 
      return self.stack.items[current++] // Get an error here: can't access items in Stack 
     } 
     return nil 
    } 
} 
+0

嗯,那很糟糕......我的意思是,不能在泛型中定義嵌套類型。我希望他們解決它。謝謝! – cfischer 2014-09-12 17:45:22

+0

等一下,這也不管用,這不是一個泛型類型: 類A { 變數名稱= 「弗雷德」 類B { FUNC富() - >字符串{ 回報名稱+「 Flinstone「 } } } – cfischer 2014-09-12 17:52:05

+0

對,這不是嵌套類型的工作方式。看起來好像你試圖把一個[嵌套類型](https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/NestedTypes.html)視爲一個[closure ](https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Closures.html)。 – 2014-09-12 18:00:32