What mutating?
Swift에서 구조체(Struct)나 열거형(Enum) 등의 값 타입(Value Types)은 자체적으로 값을 변경할 수 없음.
이는 함수나 메소드에서 해당 타입의 속성을 변경하려고 할 때 컴파일러에서 에러가 발생하는데, 이러한 제한을 뚫고 값을 변경하고자 할 때는 "mutating" 키워드를 사용함.
Exemple
코드로 예시를 들어보자.
class Car {
var speed: Int
init(speed: Int) {
self.speed = speed
}
func accelerate() {
speed += 10
}
}
struct Bike {
var speed: Int
mutating func accelerate() {
speed += 10
}
}
let car = Car(speed: 50)
car.accelerate()
print(car.speed) // 출력 결과: 60
var bike = Bike(speed: 20)
bike.accelerate()
print(bike.speed) // 출력 결과: 30
위 코드에서 Car 클래스와 Bike 구조체를 정의 했음.
두 타입은 모두 speed라는 속성을 가지고 있으며, accelerate() 메소드를 사용하여 속성 값을 변경할 수 있음.
하지만, accelerate() 메소드의 구현이 다름.
Car 클래스에서는 accelerate() 메소드에서 speed 속성 값을 변경할 때 mutating 키워드를 사용하지 않음. 이는 Car 클래스가 참조 타입(Reference Type) 이기 때문. 참조 타입의 인스턴스는 복사되는 대상이 아닌, 참조되는 대상임. 따라서 Car 클래스에서는 메소드에서 속성 값을 변경하는 것이 가능합니다.
Bike 구조체는 값 타입(Value Type) 이기 때문에 accelerate() 메소드에서 speed 속성 값을 변경할 때는 mutating 키워드를 사용해야 함. 구조체의 인스턴스는 복사되는 대상이며, 속성 값을 변경하려면 인스턴스의 값 자체를 변경해야 하기 때문임.
따라서, 값 타입에서 속성 값을 변경하는 함수는 기본적으로 mutating 키워드를 사용해야 함.