Swift 你知道MyStack为什么不';不符合协议栈?

Swift 你知道MyStack为什么不';不符合协议栈?,swift,Swift,我已经在Xcode 8β2游戏场中整合了一个简单的示例。不幸的是,我不明白为什么结构不符合协议。我相信这是件很简单的事情,但我看我这辈子都看不到 protocol ProtoStack { associatedtype ItemType func push(item: ItemType) func pop() -> ItemType func isEmpty() -> Bool func size() -> Int } struct

我已经在Xcode 8β2游戏场中整合了一个简单的示例。不幸的是,我不明白为什么
结构
不符合
协议
。我相信这是件很简单的事情,但我看我这辈子都看不到

protocol ProtoStack {

    associatedtype ItemType

    func push(item: ItemType)
    func pop() -> ItemType
    func isEmpty() -> Bool
    func size() -> Int
}

struct MyStack: ProtoStack {

    var contents = [Int]()

    typealias ItemType = Int

    mutating func push(item: Int) { contents.append(item) }
    mutating func pop() -> Int { return contents.popLast()! }
    func isEmpty() -> Bool { return contents.count == 0 }
    func size() -> Int { return contents.count }
}

为了符合当前编写的
协议,您的
MyStack
中的
推送
弹出
方法不能
变异
,因为您不能用
变异
结构/枚举方法满足非变异协议要求。因此,如果您希望这些方法是变异的,那么您还需要在协议中将它们标记为变异的

作为重点(我的):

如果定义的协议实例方法要求旨在对采用该协议的任何类型的实例进行变异,请使用变异关键字将该方法标记为协议定义的一部分这使结构和枚举能够采用协议并满足方法要求。

协议要求中的
mutating
方法可以通过值类型(例如结构或枚举)中的
mutating
1实例方法或类中的常规实例方法来满足,因为类实例可以自由地进行变异


一,。变异协议需求也可以通过值类型中的非变异方法来满足,因为这不会破坏与协议的契约(没有什么取决于该方法中实际发生的变异)

你忘了把你的
push
pop
协议要求标记为
mutating
啊,我明白了。有趣。这意味着MyStack——如上所述——只能由类实现。如果我将mutating关键字添加到协议中,那么它只能由结构实现。[编辑:尝试过,协议可以通过类和结构来实现,如果协议使用mutating关键字。](请将您的评论作为答案,我会相信。)
mutating
关键字并不意味着它只能通过结构来实现–它可以通过类中的常规方法来实现,as类实例可以自由变异。但是是的,因为它当前是编写的(没有
变异
,并且需要在
推送
弹出
中修改实例状态),所以它只能由类来满足。