이 문서를 정리하게 된 이유 : didSet 이 항상 메인쓰레드에서 실행되는 줄 알고 있다가 틀린 것을 깨닫고 부랴부랴 처음부터 다시 정리
프로퍼티 옵저버는 프로퍼티를 감시하고 있다가 프로퍼티의 값이 변경될 때, 반응한다.
프로퍼티의 값이 set 될 때, 항상 호출된다. 이전 값과 새로운 값이 같더라도 호출된다.
프로퍼티 옵저버를 추가할 수 있는 곳:
아래 코드의 출력 값은?
set
을 선언한 경우에만 호출되겠구만.test2.title = "B"
가 실행되면 어떤 것이 호출되는지 생각해보자.class Test {
var title: String {
didSet {
print("Test: \\(title)")
}
}
var computedTitle: String {
get {
return "Test: computed"
}
set {
title = newValue
}
}
init(title: String) {
self.title = title
}
}
class Test2: Test {
override var title: String {
didSet {
print("Test2: \\(title)")
}
}
override var computedTitle: String {
didSet {
print("Test2: computedTitle didSet")
}
}
}
var test2 = Test2(title: "A")
test2.title = "B"
willSet → newValue 접근가능. 직접 이름을 지정해줄 수도 있다.
didSet → oldValue. 직접 이름을 지정해줄 수 있다.
override var title: String {
didSet(myValue) {
print("Test2: \\(myValue)")
}
}
<aside> 💡 NOTE
서브클래스의 생성자에서 슈퍼클래스가 가진 속성이 set 된다면, 해당 속성의 willSet didSet 은 호출된다.
이 시점은 수퍼클래스의 생성자가 호출된 이후이다.
수퍼클래스의 생성자가 호출되기 전 시점에는 호출되지 않는다.
이것은 Initialization delegate 과 관련된 개념이다.
class Test2: Test {
var text2: String
init(text2: String) {
self.text2 = text2 // 1
super.init(text: text2) // 2
super.text = "didSet Called?" // 3
}
}
전체 코드 (실행해보셈) </aside>
계산 프로퍼티 선언부에 같이 프로퍼티 옵저버를 추가 할 수 없다.
상속된 계산 프로퍼티에는 프로퍼티 옵저버를 추가할 수 있다.
그런데 문서에 아래와 같은 내용이 있다.
For a computed property that you define, use the property’s setter to observe and respond to value changes, instead of trying to create an observer.
setter 가 호출된 이후, didSet 도 호출된다