我已经将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 }
}
答案 0 :(得分:1)
为了符合您当前编写的ProtoStack
协议,push
中的pop
和MyStack
方法不能为mutating
,因为您无法使用mutating
struct / enum方法满足非变异协议要求。因此,如果您希望这些方法为mutating
,那么您还需要在协议中将它们标记为如此。
作为Swift language guide says(强调我的):
如果定义了一个协议实例方法要求,该要求旨在改变采用该协议的任何类型的实例,请使用mutating关键字将该方法标记为协议定义的一部分。 这使得结构和枚举能够采用协议并满足该方法要求。
协议要求中的mutating
方法可以通过值类型(例如结构或枚举)中的mutating
1 实例方法或常规实例来满足类中的方法,因为类实例可以自由变异。
1。变量协议要求也可以通过值类型中的非变异方法来满足,因为这不会破坏与协议的契约(在该方法中实际发生的变异取决于) 。