프로퍼티 값의 변화를 관찰하는 것으로, "저장 프로퍼티"에 추가할 수 있다
새 값의 속성이 현재 값과 동일하더라도 속성 값이 설정되면 호출된다!
쉽게 말해서
내가 관찰하는 프로퍼티에 값을 설정하려고 할때 변경을 감지한다.
값이 저장되기 직전에 새로 저장될 값이 파라미터로 전달된다!
이때 파라미터 이름은 지정할 수 있지만 파라미터 이름과 괄호를 따로 지정하지 않을 경우 newValue 사용
var name: String = "Unknown" {
willSet(newName) {
print("현재 이름 = \(name), 바뀔 이름 = \(newName)")
}
}
var name: String = "Unknown" {
willSet {
print("현재 이름 = \(name), 바뀔 이름 = \(newValue)")
}
}
name = "Hidi"
// 현재 이름 = Unknown, 바뀔 이름 = Hidi
// 값이 변경되기 "직전"에 호출되는 것이라
// 현재 이름(name)은 아직 이전 값인 Unknown임!!!!
값이 저장된 "직후"에 이전 프로퍼티의 값이 "파라미터"로 전달된다!
이때 파라미터 이름은 지정할 수 있지만, 파라미터 이름과 괄호를 따로 지정하지 않을 경우 oldValue로 사용한다
var name: String = "Unknown" {
didSet {
print("현재 이름 = \(name), 바뀌기 전 이름 = \(oldValue)")
}
}
var name: String = "Unknown" {
didSet {
print("현재 이름 = \(name), 바뀌기 전 이름 = \(oldValue)")
}
}
name = "Hidi"
// 현재 이름 = Hidi, 바뀌기 전 이름 = Unknown
// 값이 변경된 "직후"에 호출되는 것이라
// 이전에 저장되어 있던 Unknown이 파라미터 oldValue로 넘어온 것
A. 쌉가능
1. willSet이 먼저 실행
2. 저장 프로퍼티 name의 값 변경
3. didSet 실행
var name: String = "Unknown" {
willSet {
print("현재 이름 = \(name), 바뀔 이름 = \(newValue)")
}
didSet {
print("현재 이름 = \(name), 바뀌기 전 이름 = \(oldValue)")
}
}
name = "Sodeul"
가능하다. but 부모클래스의 연산 프로퍼티를 오버라이딩 할 경우에만!
why? setter을 통해 값 변경 감지가 가능한데 굳이..?
class Human {
var name = "Unknown"
var alias: String {
get {
return name + " 바보"
}
set {
name = newValue + "별명에서 붙여진 이름"
}
willSet { } // error! 'willSet' cannot be provided together with a getter
didSet { } // error! 'didSet' cannot be provided together with a getter
}
}
class Hidi: Human {
override var alias: String {
willSet {
print("현재 alias = \(alias), 바뀔 alias = \(newValue)")
}
didSet {
print("현재 alias = \(alias), 바뀌기 전 alias = \(oldValue)")
}
}
}