속성 감시자란 변수의 속성의 변화를 감시할 수 있는 메서드 이다. 저장 속성에 대하여 willSet, didSet 메서드를 설정할 수 있는데 해당 변수의 값이 변경되기 전, 후 에 대한 감시가 가능한 메서드를 제공한다.
var animal: String = "dog" {
willSet(value) {
print("값이 \(animal) 에서 \(value)로 변경될 예정") // 값이 dog 에서 cat로 변경될 예정
}
}
animal = "cat"
animal 이라는 변수는 저장 속성이며 "dog" 라는 문자열을 값으로 가지고 있다 해당 변수의 값을 밑에서 cat으로 변경하면 willSet 메서드가 호출되면서 willSet 메서드 내부의 메세지가 출력된다.
var animal: String = "dog" {
willSet(value) {
print("값이 \(animal) 에서 \(value)로 변경될 예정")
}
didSet(value) {
print("값이 \(value) 에서 \(animal)로 변경됨")
}
}
animal = "cat"
반대로 didSet 메서드는 값이 설정되고 나서 호출되는 메서드이다. didSet 메서드에서 받는 value 라는 매개변수 또한 willSet 과는 반대로 변경되기 전의 값이 전달된다.(value 라는 이름은 정해진게 아니며 변경이 가능하다.)
매개변수로 값을 받을때 이름을 지정해줘서 받을 수 있지만 편의상 매개변수를 쓰지 않고 받는 방법도 있다.
var animal: String = "dog" {
willSet {
print("값이 \(animal) 에서 \(newValue)로 변경될 예정")
}
didSet {
print("값이 \(oldValue) 에서 \(animal)로 변경됨")
}
}
animal = "cat"
willSet 에서는 변경될 값을 newValue 로 받을 수 있으며 didSet은 이전의 값을 oldValue 로 받을 수 있다. 만약 직접 매개변수명을 정해주는것이 아니라면 oldValue, newValue 라는 정해진 이름으로 사용해야 된다.