본문 바로가기
Swfit

Observed property: willSet & didSet

by GGShin 2022. 10. 4.

지난번 글에서 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://medium.com/ios-development-with-swift/%ED%94%84%EB%A1%9C%ED%8D%BC%ED%8B%B0-get-set-didset-willset-in-ios-a8f2d4da5514

 

프로퍼티 get, set, didSet, willSet in iOS

Swift의 get, set, didSet, willSet을 활용 하는법

medium.com

 

https://www.codingem.com/didset-and-willset-in-swift/

 

didSet and willSet in Swift - codingem.com

didSet and willSet in Swift are property observers that track changes in a variable. When the variable changes, these will run some code.

www.codingem.com

 

https://stackoverflow.com/questions/35096907/why-doesnt-didset-work

 

Why doesn't didSet work?

In many examples of didSet I see on SO, this code will return 0, however, I can't get it to return anything other than the original value. What am I doing wrong? Swift struct Circle { var rad...

stackoverflow.com

 

반응형