프로퍼티 (Properties) - 프로퍼티 관찰자 (Property Observers)

00yhsp·2024년 4월 23일

프로퍼티 관찰자 (Property observers)는 프로퍼티의 값이 변경되는지 관찰하고 응답한다. 프로퍼티 관찰자는 프로퍼티의 현재 값이 새로운 값과 같더라도 프로퍼티의 값이 설정될 때 호출된다.

아래의 위치에 프로퍼티 관찰자를 추가할 수 있다:

  • 정의한 저장된 프로퍼티
  • 상속한 저장된 프로퍼티
  • 상속한 계산된 프로퍼티

상속된 프로퍼티의 경우 하위 클래스의 프로퍼티를 재정의하여 프로퍼티 관찰자를 추가한다. 정의한 계산된 프로퍼티의 경우 관찰자를 생성하는 대신에 프로퍼티의 setter를 이용하여 값 변경을 관찰하고 응답한다.

프로퍼티에 관찰자를 정의하는 방법은 2가지 선택사항을 가지며 둘다 정의할 수도 있다:

  • willSet: 값이 저장되기 직전에 호출된다.
  • didSet: 새로운 값이 저장되자마자 호출된다.

willSet 관찰자를 구현한다면 상수 파라미터로 새로운 프로퍼티 값이 전달된다. willSet 구현의 일부로 이 파라미터에 특정 이름을 가질 수 있다. 파라미터 명과 구현 내에 소괄호를 작성하지 않으면 파라미터는 newValue 의 기본 파라미터 명으로 만들어진다.

유사하게 didSet 관찰자를 구현한다면 예전 프로퍼티 값을 포함한 상수 파라미터가 전달된다. 파라미터 명을 사용하거나 oldValue 인 기본 파라미터 명을 사용할 수 있다. didSet 관찰자 내의 프로퍼티에 값을 할당한다면 새로운 값으로 방금 설정한 값을 대체한다.

Note
수퍼 클래스 프로퍼티의 willSet 과 didSet 관찰자는 수퍼 클래스 초기화가 호출된 후 하위 클래스 초기화에서 프로퍼티가 설정될 때 호출된다. 수퍼 클래스가 초기화 호출되기 전에 클래스 자체 프로퍼티를 설정하는 동안에는 호출되지 않습니다.

다음은 willSet 과 didSet 동작에 대한 예이다. 아래 예제는 사람이 걷는 동안의 걸음 수를 측정하는 StepCounter 라는 새로운 클래스를 정의한다. 이 클래스는 만보계 또는 다른 걸음 측정기의 입력 데이터와 함께 사용하여 일상생활에서 사람의 운동 루틴을 추적할 수 있다.

class StepCounter {
    var totalSteps: Int = 0 {
        willSet(newTotalSteps) {
            print("About to set totalSteps to \(newTotalSteps)")
        }
        didSet {
            if totalSteps > oldValue  {
                print("Added \(totalSteps - oldValue) steps")
            }
        }
    }
}
let stepCounter = StepCounter()
stepCounter.totalSteps = 200
// About to set totalSteps to 200
// Added 200 steps
stepCounter.totalSteps = 360
// About to set totalSteps to 360
// Added 160 steps
stepCounter.totalSteps = 896
// About to set totalSteps to 896
// Added 536 steps

StepCounter 클래스는 Int 타입의 totalSteps 프로퍼티를 선언한다. 이것은 willSet 과 didSet 관찰자를 가진 저장된 프로퍼티이다.

totalSteps 의 willSet 과 didSet 관찰자는 새로운 값이 프로퍼티에 할당될 때마다 호출된다. 새로운 값이 현재 값과 같더라도 항상 호출된다.

이 예제의 willSet 관찰자는 새로운 값을 위한 newTotalSteps 의 사용자 파라미터 명을 사용한다. 이 예제는 간단하게 설정된 값을 출력합니다.

didSet 관찰자는 totalSteps 값이 업데이트 되고난 후에 호출된다. 이것은 오래된 값에 대해 totalSteps 의 새로운 값과 비교한다. 걸음수가 증가했다면 걸음수가 얼마나 증가하였는지 출력한다. didSet 관찰자는 오래된 값에 대한 사용자 파라미터 명을 제공하지 않고 대신에 oldValue 의 기본 이름을 사용한다.

Note
관찰자를 가진 프로퍼티를 in-out 파라미터로 함수에 전달하면 willSet 과 didSet 관찰자는 항상 호출된다. 이것은 in-out 파라미터에 대한 copy-in-copy-out 메모리 모델 때문에 그렇습니다. 값은 함수 끝에서 프로퍼티에 항상 다시 작성된다.

profile
iOS Dev

0개의 댓글