我已經把Xcode8β2遊樂場中的簡單樣本放在了一起。不幸的是,我不明白爲什麼struct
不符合。我相信這是非常簡單的事情,但對我來說,看不到它。任何想法爲什麼MyStack不符合ProtoStack?
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 }
}
你忘了把'push'和'pop'的協議要求標記爲'mutating' – Hamish
啊,我明白了。有趣。這意味着MyStack - 如上所述 - 只能由一個類來實現。如果我將mutating關鍵字添加到協議中,那麼它只能由一個結構實現。 [編輯:試過了,協議可以通過類和結構來實現,如果協議使用了mutating關鍵字。] (讓你的評論成爲答案,我會讚揚它。) –
'mutating'關鍵字並不意味着它只能由一個結構實現 - 它可以通過類中的常規方法來滿足,因爲類實例可以自由變異。但是,是的,因爲它是目前編寫的(沒有'mutating',並且你需要在'push'和'pop'中修改實例狀態),所以它只能由一個類來滿足。 – Hamish