2016-07-09 3 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

あなたはmutating構造体/列挙型と非変異プロトコルの要件を満たすことができないとして、それが現在書かれているとして、あなたのProtoStackプロトコルに準拠するためには、あなたのMyStackであなたのpushpop方法は、mutatingすることはできません方法。したがって、これらのメソッドをmutatingにしたい場合は、プロトコルにもそのようにマークする必要があります。 Swift language guide says(強調鉱山)として

もしプロトコルを採用している任意のタイプのインスタンスを変異させることが意図されるプロトコルインスタンスメソッドの要件を定義する場合、の一部として変異キーワードでメソッドをマークプロトコルの定義これにより、構造と列挙でプロトコルを採用し、そのメソッドの要件を満たすことができます。

プロトコル要件にmutatingメソッドは、クラスのインスタンスができると値型(例えば、構造体または列挙)またはクラスの正規インスタンスメソッドでmutating インスタンスメソッドにより満たすことができるいずれか自由に変異させることができる。

1.これはプロトコルとの契約を破壊しないよう変異プロトコル要件も(変異にを依存何が実際にその中に行われていない、値型で非変異法により満足させることができます方法)。

関連する問題