2014-09-12 146 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