任何想法为什么MyStack不符合ProtoStack?

时间:2016-07-09 14:39:38

标签: swift

我已经将Xcode8β2游乐场中应该是一个简单的样本放在一起。很遗憾,我无法理解为什么struct不符合protocol。我确信这是非常简单的事情,但对于我的生活,我不能看到它。

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

1 个答案:

答案 0 :(得分:1)

为了符合您当前编写的ProtoStack协议,push中的popMyStack方法不能为mutating,因为您无法使用mutating struct / enum方法满足非变异协议要求。因此,如果您希望这些方法为mutating,那么您还需要在协议中将它们标记为如此。

作为Swift language guide says(强调我的):

  

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

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

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