🪬

【Swift】mutatingキーワードについて

に公開

Struct や Enum のような値型では、自身の値を変更する場合には、メソッドの宣言に mutating キーワードをつける必要があります。

mutating キーワードが指定されたメソッドを実行してインスタンスの値を変更すると、インスタンスが格納されている変数への暗黙的な再代入が行われます。

mutating キーワードが指定されたメソッドの呼び出しは再代入として扱われるので、定数に格納された値型のインスタンスに対しては実行できずにコンパイルエラーとなります。

// 以下のコードは「Swift実践入門」6.2からの引用です

extension Int {
    mutating func increment() {
        self += 1
    }
}

var a = 1  // 1
a.increment()  // 2(aに再代入が行われている)

let b = 1
b.increment()  // bに再代入できないためコンパイルエラー

Struct の場合は、ストアドプロパティを変更する場合にも mutating キーワードが必要になります。

struct SampleStruct {
    var count: Int

    init(count: Int) {
        self.count = count
    }

    mutating func countUP() {
        self.count += 1
    }
}

// letで宣言するとコンパイルエラーとなる
var sampleStruct = SampleStruct(count: 1)
sampleStruct.countUP()
sampleStruct.count  // 2

参考記事

https://qiita.com/shtnkgm/items/3a00117c9b918616d116

https://amzn.to/2RcBsEH

Discussion