Swiftの構造体は列挙型と同様、メソッドを使って自身が持つプロパティの値を変更することができない。

もしプロパティを変更したい場合は、メソッドを定義する際にmutating属性を設定する必要がある。

それでは例を見ていこう。

mutating属性の使用例

線と点を表す二つの構造体がある。

struct Line {
    var p1: Point
    var p2: Point
    
    mutating func move(h: Double, v: Double) {
        p1.x += h
        p1.y += v
        p2.x += h
        p2.y += v
    }
}

struct Point {
    var x: Double
    var y: Double
}

Line構造体ではp1、p2と線の両端の座標をプロパティとして持っている。

moveメソッドでは自身のプロパティである座標の値を書き換えているので、必ずmutating属性の設定が必要となる。

mutating属性を設定しないとXcodeのエラーで「Left side of mutating operator isn’t mutable: ‘self’ is immutable」というメッセージが表示されるはずだ。

定義した構造体を実際に使用して、moveメソッドの動作確認をおこなってみる。

let point1 = Point(x: 100, y: 100)
let point2 = Point(x: 300, y: 200)

var theLine = Line(p1: point1, p2: point2)

print("移動前の端点p1: \(theLine.p1)")
print("移動前の端点p2: \(theLine.p2)")

theLine.move(h: 50, v: 60)

print("移動後の端点p1: \(theLine.p1)")
print("移動後の端点p2: \(theLine.p2)")

// 移動前の端点p1: Point(x: 100.0, y: 100.0)
// 移動前の端点p2: Point(x: 300.0, y: 200.0)

// 移動後の端点p1: Point(x: 150.0, y: 160.0)
// 移動後の端点p2: Point(x: 350.0, y: 260.0)

moveメソッドに渡した引数の値の分だけ、プロパティの値が変わっていることが分かる。