为什么下一个变异函数在迭代后不会改变结构(符合Sequence和IteratorProtocol)?

时间:2017-06-27 06:44:45

标签: swift sequence mutating-function iterator-protocol

我编写了一个堆栈结构,并使其符合IteratorProtocolSequence协议。 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)

这是控制台输出: enter image description here

我不明白为什么堆栈没有变化。我认为在变异next()调用后它变空了。

1 个答案:

答案 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)会为您提供所需的行为。