2016-07-09 50 views
1

我已經把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 } 
} 
+1

你忘了把'push'和'pop'的協議要求標記爲'mutating' – Hamish

+0

啊,我明白了。有趣。這意味着MyStack - 如上所述 - 只能由一個類來實現。如果我將mutating關鍵字添加到協議中,那麼它只能由一個結構實現。 [編輯:試過了,協議可以通過類和結構來實現,如果協議使用了mutating關鍵字。] (讓你的評論成爲答案,我會讚揚它。) –

+1

'mutating'關鍵字並不意味着它只能由一個結構實現 - 它可以通過類中的常規方法來滿足,因爲類實例可以自由變異。但是,是的,因爲它是目前編寫的(沒有'mutating',並且你需要在'push'和'pop'中修改實例狀態),所以它只能由一個類來滿足。 – Hamish

回答

1

爲了符合你的ProtoStack協議,因爲它是目前寫的,你pushpop方法在MyStack不能mutating,因爲你不能滿足與mutating結構/枚舉非不同誘變協議要求方法。因此,如果您希望這些方法是mutating,那麼您還需要在協議中將它們標記爲如此。

作爲Swift language guide says(重點煤礦):

如果定義意在突變的任何類型的採用協議的實例的協議實例方法的要求,標記與突變關鍵字的方法的一部分協議的定義。 這使得結構和枚舉可以採用協議並滿足該方法的要求。

在協議要求甲mutating方法既可以通過在一個值類型mutating 實例方法滿足(例如一個結構或枚舉),或在一個類中的常規實例方法中,作爲類別實例可以自由變異。

1.一種不同誘變協議要求也可以通過在一個值類型的非突變的方法滿足,因爲這不破與協議合同(沒有取決於上實際上正在內那個地方的突變方法)。

相關問題