본문 바로가기

Swift

Swift(3) - Property Observers(프로퍼티 감시자)란 무엇일까?

이번에는 저번에 정리하였던 연산 프로퍼티(Computed Properties)에 이어서 프로퍼티 감시자에 대해서 정리해보도록 하겠습니다. 

제가 생각할 때 프로퍼티 감시자도 자주 사용하는 만큼 열심히 정리해보도록 하겠습니다!

 

프로퍼티 감시자( Property Observers)


이번에도 Apple 공식 문서를  통해 프로퍼티 감시자에 대해 알아보도록 하겠습니다!

 

이 내용들을 정리해보고 설명해보자면

  1. 프로퍼티 감시자를 사용하면 프로퍼티의 값이 변경됨에 따라 적절한 대응을 하는 것이 가능합니다.

  2. 프로퍼티 감시자는 값이 새로 할당될 때마다 호출되게 됩니다. (그렇다면 변경되는 값이 이전의 값과 같으면 어떻게 될까요? 정답은 변경되는 값이 같더라도 호출!됩니다.)

  3. 지연 저장 프로퍼티를 제외한 저장 프로퍼티에 추가가 가능합니다.

  4. 재정의를 통해 상속받은 저장 프로퍼티 또는 연산 프로퍼티에도 추가가 가능합니다. 하지만 상속받지 않은 연산 프로퍼티에는 정의해줄 필요가 없습니다. 왜냐하면 연산 프로퍼티의 setter에서 프로퍼티 감시자를 구현이 가능하기 때문입니다!

  5. 프로퍼티 감시자는 프로퍼티의 값이 변경되기 직전 호출되는 willSet 메서드와  프로퍼티의 값이 변경된 직후에 호출되는 didSet 메서드가 있습니다.

 

 

그렇다면 이번에는 프로퍼티 감시자에서 사용하는 메서드인 willSet과 didSet에 대해서 정리해보도록 하겠습니다!

 

willSetdidSet

1. willSet 

  • willSet 메서드에 전달되는 전달 인자는 프로퍼티가 변경될 값 입니다.

  • 연산 프로퍼티의 set 과 마찬가지로 매개변수 이름에 괄호를 쓰지 않는다면 기본 매개변수인 newValue 를 사용할 수 있습니다. ( 이 내용은 제가 연산 프로퍼티에서 예시를 들고 설명했던 만큼 이해가 되지 않으신다면 저번 글을 참고하시면 좋을 것 같습니다!)

2. didSet

  •  didSet 메서드에 전달되는 전달 인자는 프로퍼티가 변경되기 전의 값 입니다.

  • 매개변수 이름을 지정하지 않는다면 기본 매개변수인 oldValue 를 사용할 수 있습니다.

 

항상 그렇듯이 이렇게 정의만 보면 이해가 잘 되지 않는데요. 이번에는 애플 문서의 예시를 보며 이해하도록 해볼게요!

 

  • 위에서 프로퍼티 감시자에 대해 정리한 내용처럼 이 예시를 보면 totalSteps라는 저장 프로퍼티에 프로퍼티 감시자가 선언되어 있는 것을 확인할 수 있습니다!
  • 여기서 willSetnewTotalSteps 라는 파라미터 이름을 사용하여 새로운 값을 관찰하고 있습니다.
  • (중요!!!) willSet 의 경우는 값이 저장되기 전에 호출되는 것이고 didSet 의 경우 값이 설정된 직후에 불리는 것이므로 stepCounter.totalSteps = 350 했을 때 totalSteps의 값이 350인 것입니다!
  • 또한 didSet 메서드는 위에서 매개변수를 따로 정해주지 않았기 때문에 기본 매개변수인 oldValue 를 사용하는 것을 확인할 수 있습니다.

 

이렇게 정리를 할까 하다가 예시를 한 가지 정도는 더 보는 게 좋을 것 같아 다른 예시를 찾아보았는데요.

  • 이렇게 보셨을 때 프로퍼티 감시자가 어떻게 사용됐는지 이제 감이 오시나요??? 
  • 간단하게 이 코드를 설명해보자면 섭씨온도와 화씨온도를 바꿀 건데요.
  • 여기서 보시면 updateCelsiusLabel() 메서드에 의해 값이 바뀔 때마다 프로퍼티 감시자가 호출되어 fahrenheitValue 에 값을 할당해주는 것입니다!

이렇게 프로퍼티 감시자(Property Observers)를 잘 사용한다면  값이 바뀌거나 하는 상황에 메서드를 만들어주지 않고도 변경이 가능하기 때문에 유용합니다!!


오늘은.. 여기까지..