从Swift中的扩展访问结构的存储属性

时间:2014-09-12 13:26:10

标签: swift

我试图在Swift中实现Stack结构并使其符合GeneratorSequence

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

        }
    }
}

编译器不允许我访问Stack.items中的StackGenerator属性表单。这是预期的吗?我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

通用类型不能包含嵌套类型 - 您需要在StackGenerator声明之外构建Stack,或在GeneratorOf<T>函数中使用generate类型。

第一个选项可能如下所示:

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
    }
}