メソッドが属するインスタンスの変更を必要とする場合があります。値型(つまり、構造体と列挙型)のインスタンスメソッドには、そのメソッドが属するインスタンスとそのインスタンスのプロパティを変更できることを示すために、メソッドの func キーワードの前に mutating キーワードを置きます。この処理は Modifying Value Types from Within Instance Methods で説明されています。

プロトコルを採用する型のインスタンスを変更することを目的としたプロトコルのインスタンスメソッド要件を定義する場合には、プロトコルの定義の一部として、メソッドに mutating キーワードを付けます。これにより、構造体と列挙型がプロトコルを採用し、メソッド要件を満たすことができます。

NOTE
プロトコルのインスタンスメソッド要件に mutating を付ける場合、クラスにそのメソッドの実装を記述するときには mutating キーワードを記述する必要はありません。mutating キーワードは構造体および列挙型でのみ使用されます。

次の例では、インスタンスメソッド要件 toggle を定義するプロトコル Togglable を定義しています。名前が示すように、toggle() メソッドはトグルすることを目的とし、準拠する型の状態をその型のプロパティを変更することで反転します。

toggle() メソッドには Togglable プロトコル定義の一部として mutating キーワードが付けられていて、そのメソッドが呼びだされたときに、準拠するインスタンスの状態を変化させることを示しています。

protocol Togglable {
    mutating func toggle()
}

構造体や列挙型に Togglable プロトコルを実装する場合、その構造体や列挙型は mutating と付けられた toggle() メソッドの実装を提供することでプロトコルに準拠することができます。

次の例では、構造体 OnOffSwitch を定義しています。この列挙型はケース On と Off で示された 2 つの状態を切り替えます。列挙型の toggle 実装には、Togglable プロトコル要件に準拠させるために mutating が付けられています。

enum OnOffSwitch: Togglable {
    case Off, On
    mutating func toggle() {
        switch self {
        case Off:
            self = On
        case On:
            self = Off
        }
    }
}
var lightSwitch = OnOffSwitch.Off
lightSwitch.toggle()
// lightSwitch は .On

Portions of this page are translations based on work created and shared by Apple and used according to terms described in the Creative Commons Attribution 4.0 International License.