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