728x90
mutating을 본격적으로 공부하기 위해서는 구조체에 대해서 제대로 알고 있어야 합니다.
Swift에서 클래스는 참조 타입이고 구조체, 열거형은 값 타입입니다. 값 타입인 구조체에서는 인스턴스 메소드 내에서 프로퍼티들을 수정할 수 없게 되어 있습니다. 따라서, 이러한 프로퍼티들은 구조체 안의 메소드에서 수정을 해주기 위해 mutating이라는 키워드를 사용하게 됩니다.
mutating
특정 메소드 내에서 구조체 또는 열거형의 프로퍼티들을 수정해야 하는 경우, 해당 메소드의 동작을 변경하도록 하는 것
간단한 코드를 통해서 알아보도록 하겠습니다.
struct Person {
let name: String
var age: Int
init(name: String, age: Int) {
self.name = name.uppercased()
self.age = age
}
func changeAge() {
age = 10 // Error
}
}
위와 같이 Person이라는 구조체를 만들어보았습니다.
Person이라는 구조체는 name과 age를 프로퍼티로 갖고 있고 changeAge()라는 메소드를 갖고 있습니다. 그리고 init을 통해 초기화도 해주었습니다. 보기에는 정상적인 코드인 것 같지만 바로 에러가 뜨는 것을 확인할 수 있습니다.
에러의 이유는 다음과 같습니다.
Cannot assign to property: 'self' is immutable
이런 에러는 바로 값 타입인 구조체에서는 메소드 안의 값을 수정할 수 없기 때문에 일어나는 것입니다.
struct Person {
let name: String
var age: Int
init(name: String, age: Int) {
self.name = name.uppercased()
self.age = age
}
mutating func changeAge() {
age = 20
}
}
var man = Person(name: "SOKYTE", age: 25)
man.changeAge()
print(man.age)
mutating 키워드를 추가하면 초기화에서는 25살로 되지만, changeAge() 메소드를 통해서 age가 20으로 바뀐 것을 확인할 수 있습니다.
'Swift' 카테고리의 다른 글
some (0) | 2022.04.29 |
---|---|
Any/AnyObject (0) | 2022.04.29 |
Generic (0) | 2022.04.29 |
atomic VS nonatomic (0) | 2022.04.26 |
Initialization - 구조체/클래스 초기화 (0) | 2022.04.21 |