모바일앱/Swift
mutating 과 구조체
GeekCode
2022. 4. 13. 16:50
반응형
참고: https://velog.io/@wook4506/iOS-Swift-Swift-문법을-알아보자-18편-mutating
Class && Struct && Enum 미완 enum추가
기존 글에서 클래스는 참조타입이고 구조체와 열거형은 값 타입이라고 정리를 했다.
그래서 값타입인 구조체에서는 인스턴스 메소드 내에서 프로퍼티들을 수정할 수 없게 되어있다.
때문에 이 프로퍼티들을 구조체 안에 있는 메소드에서 수정을 하려면 mutating이라는 키워드를 사용해야한다.
mutating
특정 메소드 내에서 구조체 또는 열거형의 프로퍼티를 수정해야하는 경우, 해당 메소드의 동작을 변경하도록 하는 것
예시를 보면 Person이라는 구조체에서 init을 통해 초기화를 해주어서 완벽한 코드처럼 보이지만 에러가 발생한다.
struct Person {
let name: String
var age: Int
init(name: String, age: Int) {
self.name = name.uppercased()
self.age = age
}
func changeAge() {
age = 10 //에러! Cannot assign to property: 'self' is immutable
}
}
위 에러는 바로 값타입인 구조체에서 메소드안의 값을 수정할 수 없기때문에 발생하는 것이다.
changeAge() 메소드 앞에 mutating을 붙여서 수정을 해보면
man 인스턴스를 처음 init할 때에는 24를 넣었지만 changeAge()메소드를 통해 age가 10으로 바뀌었다.
struct Person {
let name: String
var age: Int
init(name: String, age: Int) {
self.name = name.uppercased()
self.age = age
}
mutating func changeAge() {
age = 10
}
}
var man = Person(name: "Song", age: 24)
man.changeAge()
print(man.age)
반응형