프로퍼티 값의 변화를 관찰하는 것으로, 저장 프로퍼티에 추가할 수 있다.
새 값의 속성이 현재 값과 동일하더라도 속성 값이 설정되면 호출된다
willSet 옵저버를 구현하면, 값이 저장되기 직전에 새로 저장될 값이 파라미터로 전달 된다. 이때 파라미터 이름은 지정할 수 있지만, 파라미터 이름과 괄호를 따로 지정하지 않을 경우 newValue로 사용한다.
var name: String = "Unknown" {
willSet(newName){
print("현재이름 = \(name), 바뀔이름 = \(newName)")
}
}
var name: String = "Unknown" {
willSet {
print("현재 이름 = \(name), 바뀔 이름 = \(newValue)")
}
}
didSet 옵저버를 구현하면, 값이 저장된 직후에 이전 프로퍼티의 값이 파라미터로 전달된다. 이때 파라미터 이름은 지정할 수 있지만, 파라미터 이름과 괄호를 따로 지정하지 않을 경우 oldValue로 사용한다
var name: String = "Unknown" {
didSet(oldName) {
print("현재 이름 = \(name), 바뀌기 전 이름 = \(oldName)")
}
}
var name: String = "Unknown" {
didSet {
print("현재 이름 = \(name), 바뀌기 전 이름 = \(oldValue)")
}
}
ex)
var name: String = "Unknown" {
willSet {
print("현재 이름 = \(name), 바뀔 이름 = \(newValue)")
}
didSet {
print("현재 이름 = \(name), 바뀌기 전 이름 = \(oldValue)")
}
}
name = "abc"
부모 클래스의 연산 프로퍼티를 오버라이딩 할 경우 프로퍼티 옵저버를 추가할 수 있다.
class Human {
var name = "Unknown"
var alias: String {
get {
return name + "def"
}
set {
name = newValue + "ghi"
}
willSet { } //에러
didSet { } //에러
}
}
class People: Human {
override var alias: String {
willSet {//부모 클래스의 연산 프로퍼티를 오버라이딩 했으므로 옵저버 추가 가능
print("현재 alias = \(alias), 바뀔 alias = \(newValue)")
}
didSet {//부모 클래스의 연산 프로퍼티를 오버라이딩 했으므로 옵저버 추가 가능
print("현재 alias = \(alias), 바뀌기 전 alias = \(oldValue)")
}
}
}
참조
개발자 소들이