我试图在Swift
中实现Stack结构并使其符合Generator
和Sequence
。
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
属性表单。这是预期的吗?我该如何解决这个问题?
答案 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
}
}