프로퍼티 옵저버(WillSet&DidSet)

라무·2023년 8월 9일

프로퍼티 옵저버란?

자신이 정의한 저장 프로퍼티에 추가할 수 있으며, super class(부모 클래스)를 상속한 프로퍼티ㅣ에도 추가할 수 있다

🔥 프로퍼티 값의 변화를 관찰하고 이에 응답한다

cf) 새로운 값이 프로퍼티의 현재 값과 동일하다고 하더라도 속성의 값이 설정될 때 마다 호출된다

즉, 저장프로퍼티와 연산 프로퍼티를 감시하는데 사용한다

종류

WillSet

🔥 값이 저장되기 직전에 호출됨

새로운 프로퍼티의 값이 상수 매개변수(constant parameter)로 전달된다

willSet 구현의 일부로 이 매개변수의 이름을 지정할 수 있다

구현 내의 매개변수 이름과 괄호를 쓰지 않으면 newValue라는 기본 매개변수 이름을 사용하여 이 매개변수를 사용할 수 있다

DidSet

🔥 새로운 값이 저장된 직후에 호출된다

이전 프로퍼티 값을 포함하는 상수 매개변수(constant parameter)가 전달된다

매개변수의 이름을 지정하거나, oldValue라는 개본 매개변수 이름을 사용할 수 있다

자체적으로 설정한 옵저버 내에서 프로퍼티에 값을 할당하면, 할당한 새 값이 방금 설정한 값으로 변경된다

예시

  • 즉, newValue는 우리가 값을 넣어줬을 때 변화 될 값
  • oldValue는 우리가 원래 가지고 있었던 값을 의미한다 → 변화되기 이전의 값
class SetAge {
	
	//myAge는 저장 프로퍼티이다
	var myAge = 0 { 
		willSet { //WillSet은 값이 지정되기 직전에 호출되고 파라미터로의 이름을 정의해주지 않았으므로 newValue라는 이름을 사용한다
			print("값이 설정될 예정이다. myAge: \(newValue)") //newValue는 새로설정될 값이 들어간다
		}
		didSet {  //값이 설정된 후에 탄다 파라미터의 이름을 정의해주지 않았으므로 oldValue로 값설정 전의 값을 불러올 수 있다
			print("값이 oldValue: \(oldValue)에서 myAge: \(myAge)로 설정될 예정이다") //oldValue는 0이다
		}
	
	myAge = 10
}

//willSet과 didSet에서 파라미터의 이름을 넣어줄 경우

class SetAge {
	
	//myAge는 저장 프로퍼티이다
	var myAge = 0 { 
		willSet(newAge) { 
			print("값이 설정될 예정이다. myAge: \(newAge)") //newAge = 10
		}
		didSet(oldAge) {  
			print("값이 oldValue: \(oldAge)에서 myAge: \(myAge)로 설정될 예정이다") //oldAge = 0, myAge = 10
		}
	
	myAge = 10
}

주의사항

  • lazy 저장 프로퍼티를 제외하고 정의된 저장 프로퍼티에 프로퍼티 옵저버를 추가할 수 있다
  • 하위 클래스 내의 프로퍼티를 재정의하여, 상속된 프로퍼티(저장 프로퍼티 or 연산프로퍼티 어느것이든)에도 프로퍼티 옵저버를 추가할 수 있다
  • 오버라이드(override)되지 않은 연산프로퍼티에 대한 프로퍼티 옵저버는 연산프로퍼티 setter에서 해당 값의 변경을 관찰하고 이에 응답할 수 있으므로 정의할 필요가 없다!!

즉! 원래는 저장 프로퍼티에만 프로퍼티 옵저를 추가할 수 있으며, 부모클래스를 상속하는 하위 클래스의 프로퍼티는 저장프로퍼티든, 연산프로퍼티든 프로퍼티 옵저버를 추가할 수 있다

  • 부모클래스 프로퍼티의 willSet, didSet 옵저버는 부모클래스 initializer가 호출된 후 자식 클래스의 initializer에서 set될 때 호출된다
  • 부모클래스 initialzer가 호출되기 전에, 클래스가 자체 프로퍼티들을 setting하는 동안은 옵저버들은 호출되지 않는다

참고한 블로그

Swift ) Properties - Property Observers(프로퍼티 옵저버)

profile
ios 개발을 하고있는 라무의 사적인 기술 블로그

0개의 댓글