mutating 키워드는 struct의 메서드 내에서 인스턴스 자체의 프로퍼티를 수정할 때 사용한다. 값 타입인 구조체에서는 인스턴스 메소드 내에서 프로퍼티들을 수정할 수 없기 때문이다.
struct Point {
var x: Int
var y: Int
// 이 메서드는 인스턴스의 프로퍼티를 변경하기 때문에 `mutating`으로 표시되어야 함
mutating func moveBy(x deltaX: Int, y deltaY: Int) {
self.x += deltaX
self.y += deltaY
}
}
var point = Point(x: 1, y: 1)
point.moveBy(x: 2, y: 3) // point는 이제 (3, 4)
Point 구조체에는 moveBy(x:y:)라는 메서드가 있다. 이 메서드는 구조체의 x와 y 프로퍼티를 변경한다. 메서드가 mutating으로 표시되어 있기 때문에, 이 메서드는 var로 선언된 인스턴스에서만 호출할 수 있다. let으로 선언된 인스턴스에서는 mutating 메서드를 호출할 수 없다.
만약 let으로 선언된 인스턴스에 대해 mutating 메서드를 호출하려고 하면 컴파일 에러가 발생한다.
let constantPoint = Point(x: 1, y: 1)
constantPoint.moveBy(x: 2, y: 3) // 컴파일 에러
let으로 선언된 인스턴스는 불변(immutable)이기 때문이다.