[Swift] Property Observer(속성 감시자)

어흥·2024년 5월 21일

Swift

목록 보기
13/28

안녕하세요! 오늘은 드디어 속성 마지막 편인, 속성감시자 포스팅입니다.
속성감시자는 일반적인 속성과는 다르게 말 그대로 감시하는 속성이라고 생각하면 되겠습니다!

Property Observer

Property observers observe and respond to changes in a property’s value. Property observers are called every time a property’s value is set, even if the new value is the same as the property’s current value.

속성 감시자는 프로퍼티의 값의 변화를 관찰하고 감시하는 속성입니다. 속성 값을 설정할 때마다(기존 값과 같더라도) 속성 감시자가 호출됩니다.어떤 속성이 변하는 시점을 알고 싶을 때 사용하기 좋습니다.

어떤 값을 '저장'하는 역할이 아니라 어떤 값이 '변할 때(값이 같아도 됨)' 관찰하고 감시하는 메서드라고 생각하면 됩니다.

class StepCounter {
    var totalSteps: Int = 0 {
        willSet(newTotalSteps) {
        	print("totalStep이 \(newTotalSteps)으로 변할 예정입니다. ")
        }
        didSet (oldTotalSteps){
            if totalSteps > oldTotalSteps  {
                print("totalStep이 \(totalSteps - oldTotalSteps) 만큼 추가되었습니다.")
            }
        }
    }
    init(totalSteps: Int) {
    	self.totalSteps = totalSteps
    }
}

종류

  1. willSet
    willSet은 값이 저장되기 직전에 호출됩니다.
    파라미터로 바뀔 값을 전달됩니다.
  2. didSet
    didSet은 값이 저장된 직후에 호출됩니다.
    파라미터로 바뀌기 전의 과거의 값이 전달됩니다.
  • 초기화시, willSet/didSet이 호출되지 않습니다.
let stepCounter = StepCounter()
stepCounter.totalSteps = 200
// totalStep이 200으로 변할 예정입니다.
// totalStep이 200만큼 추가되었습니다.
stepCounter.totalSteps = 360
// totalStep이 360 변할 예정입니다.
// totalStep이 160 추가되었습니다.
stepCounter.totalSteps = 896
// totalStep이 896 변할 예정입니다.
// totalStep이 536 추가되었습니다.

파라미터 생략

파라미터를 생략가능합니다.

  • willSet 블록에서는 바뀔 값을 파라미터로 전달했는데 이를 생략하고 newValue로 사용할 수 있습니다.
  • didSet 블록에서는 바뀌기 전의 과거의 값을 파라미터로 전달했는데 이를 생략하고 oldValue로 사용할 수 있습니다.
class StepCounter {
    var totalSteps: Int = 0 {
        willSet {
        	print("totalStep이 \(newValue)으로 변할 예정입니다. ")
        }
        didSet {
            if totalSteps > oldValue  {
                print("totalStep이 \(totalSteps - oldValue) 만큼 추가되었습니다.")
            }
        }
    }
}

0개의 댓글