프로퍼티 옵저버는 프로퍼티의 값의 변화를 관찰하고, 이에 응답합니다.
새로운 값이 프로퍼티의 현재 값과 동일하더라도 속성의 값이 설정될 때마다(set) 호출됩니다.
프로퍼티 옵저버를 사용하기 위해서는 프로퍼티의 값이 반드시 초기화 되어 있어야 합니다.
또한 클래스의 init()안에서 값을 할당 할 때는 didSet,, willSet은 호출 되지 않습니다.
lazy 저장 프로퍼티를 제외하고, 정의된 저장 프로퍼티에 프로퍼티 옵저버를 추가할 수 있습니다.
또한, 하위 클래스 내의 프로퍼티를 재정의하여, 상속된 프로퍼티에도 프로퍼티 옵저버를 추가할 수 있습니다.
즉, 원래는 저장 프로퍼티에만 프로퍼티 옵저버를 추가할 수 있지만, 부모 클래스를 상속하는 하위 클래스의 프로퍼티는 프로퍼티 옵저버를 추가할 수 있습니다.
Swift는 프로퍼티 옵저버로 didSet, willSet을 제공합니다.
하나의 프로퍼티에 대해 다음 옵저버를 정의할 수 있습니다.
willSet: 값이 저장되기 직전에 호출됩니다. 새로운 프로퍼티의 값이 newValue로 제공됩니다.
didSet: 새로운 값이 저장된 직후에 호출됩니다. 이전 프로퍼티의 값이 oldValue로 제공됩니다.
var myPropery: Int = 10 {
didSet(oldValue) {
// myProperty의 값이 변경된 직후에 호출, oldVal은 변경 전 myProperty의 값
}
willSet(newVal) {
// myProperty의 값이 변경되기 직전에 호출, newVal은 변경 될 새로운 값
}
}
프로퍼티 옵저버의 가장 빈번한 사용은 Model에서 갱신되 값을 View에 보여줄 때 입니다.
View에 점수를 표시하는 Label이 있다고 가정하고, 점수가 바뀔때마다 View의 Label을 업데이트 한다고 가정.
var score: Int = 10 {
didSet {
score.Label.text = "Score: \(score)"
}
}
위 코드를 작성하면 score 값이 바뀔 때 마다 View의 값을 갱신하는 작업을 따로 해줄 필요가 없습니다.
@IBOutlet weak var productItemImageView: UIImageView! {
didSet { // productItemImageView의 값이 변경된 직후에 호출
productItemImageView.layer.cornerRadius = 5
}
}
위 코드를 작성하면 ImageView의 이미지가 바뀔 때 마다 이미지 뷰의 cornerRadius값이 5로 설정됩니다.