지난번 글에서 get을 이용해 특정 property의 값을 계산하여 얻을 수 있고, set을 이용하여 값을 설정할 수 있다는 것을 알게 되었습니다.
Swift에서는 property의 값이 변경(set)될 때 이를 감지하는 메서드도 제공을 하고 있습니다. 값이 변경되기 직전과 값이 변경된 직후를 감지할 수 있는데, 이런 기능이 가능한 property를 Observed property 라고 부릅니다.
Observed property를 선언하게 되면, 감시되는 프로퍼티라는 명칭 그대로 어떠한 변화가 있기 전이나 후를 감시할 수 있게 됩니다.
Computed property의 경우는 property 선언 시에 값을 꼭 할당할 필요가 없었습니다. 반면에 Observed property는 선언 시에 값을 할당해 주어야 합니다. 그리고 observed property 역시 computed property와 마찬가지로 let이 아닌 var로만 선언이 가능합니다.
var myObservedProperty:Int = 10 {
willSet {}
didSet {}
}
기본적으로는 위와 같은 형태가 됩니다! willSet이나 didSet 한 가지만 사용해도 무방합니다.
Observed property는값의 변화가 있기 직전 또는 직후에 일련의 작업을 수행하고 싶을 때 유용하게 쓰일 수 있을 것 같습니다!
어떠한 때에 사용하는지 알아본 내용들을 간략하게 나누어 보겠습니다.
1. data validation
데이터의 유효성 검사가 가능합니다.
👀 set으로도 유효성 검사가 가능한데, set에서 하는 유효성 검사와 willSet 또는 didSet에서 하는 유효성 검사의 차이가 있는지는 좀 더 알아봐야 할 것 같습니다!
var temp:Int = 10 {
didSet {
if(temp < 0) {
print("Not a valid value, back to oldValue")
temp = oldValue
}
}
}
temp = -1
print(temp)
//Prints
//10
//Not a valid value, back to oldValue
//10
위의 예제에서는 temp의 initial value는 10입니다. 하지만 temp의 값이 0보다 작은 값으로 설정되면 invalid value라는 문구와 함께 이전 값(oldValue => swift에서 제공하는 이름입니다.)으로 되돌아 가게 됩니다.
2. Model에서 변경된 값을 View에서 보여줄 때
만약 View에 이름 표시하는 Label이 있고, 이름이 바뀔때마다 해당 Label을 업데이트 하고 싶다고 가정해 봅니다. 이 때 didSet을 활용하여 해당 업데이트를 진행할 수 있습니다.
var name: String = "GG" {
didSet {
nameLabel.text = name
}
}
이렇게 하면 name 변수의 값이 변할 때 nameLabel.text의 값도 자동으로 변하게 됩니다!
** didSet과 관련된 질문 중 알아두면 좋을 것 같은 내용이 있어서 가져왔습니다.
Q: didSet으로 유효성 검사를 설정해두었는데, 왜 init 시에는 올바르지 않은 값이 들어가도 didSet이 실행되지 않는 건가요?
struct Circle {
var radius: Double {
didSet {
if radius < 0 {
radius = 0
}
}
}
}
var circ = Circle(radius: -25)
print(circ.radius)
//Prints -25.0
//(the questioner expected 0.0)
A: didSet은 init시에 trigger 되는 것이 아니기 때문입니다.
=> 언제 trigger 되는 지 시점을 잘 알아야 합니다!
여기까지 Observed property인 willSet, didSet을 알아보았습니다. 더 유용한 내용이 있으면 추가하도록 하겠습니다 :-)
감사합니다!
참고 자료
https://www.codingem.com/didset-and-willset-in-swift/
https://stackoverflow.com/questions/35096907/why-doesnt-didset-work
'Swfit' 카테고리의 다른 글
Function Type에 대해 알아보기 (0) | 2022.10.17 |
---|---|
Light, dark 모드 별 사용될 backgroundimage 설정하기 (0) | 2022.10.07 |
Computed property - get, set 알아보기! (0) | 2022.09.30 |
[Realm] 데이터 저장하는 방법(Create) (0) | 2022.04.08 |
[Realm] 데이터 불러오는 방법(Read) (2) | 2022.03.30 |