我编写了一个堆栈结构,并使其符合IteratorProtocol
和Sequence
协议。 next
函数正在发生变异。所以我想堆栈的迭代会改变结构。
import Foundation
struct Stack<Element> {
var store:[Element] = []
mutating func push(_ element:Element) {
store.append(element)
}
mutating func pop() -> Element? {
return store.popLast()
}
}
extension Stack: Sequence, IteratorProtocol {
mutating func next() -> Element? {
return pop()
}
}
var stack = Stack<Int>()
stack.push(1)
stack.push(2)
stack.push(3)
for s in stack {
print(s)
}
print(stack)
我不明白为什么堆栈没有变化。我认为在变异next()
调用后它变空了。
答案 0 :(得分:1)
您的for ... in
- 循环在堆栈副本上工作,永远不会更改堆栈本身。如果您自己致电next()
,pop()
会修改堆栈,如您所见:
import Foundation
struct Stack<Element> {
var store: [Element] = []
mutating func push(_ element:Element) {
store.append(element)
}
mutating func pop() -> Element? {
return store.popLast()
}
}
extension Stack: Sequence, IteratorProtocol {
mutating func next() -> Element? {
return pop()
}
}
var stack = Stack<Int>()
stack.push(1)
stack.push(2)
stack.push(3)
for s in stack {
print(s)
}
stack.next()
print(stack.store)
输出:
3
2
1
[1, 2]
然而,正如@ user3581248在注释中指出的那样,使Stack成为一个类而不是一个结构(并从其函数中删除mutating
)会为您提供所需的行为。