본문 바로가기
iOS/Swift

[iOS] didSet,willSet 그리고 get,set

by 안녕주 2022. 2. 16.

쨔잔! didset에 대해 알아봅시다! 처음에는 didset 하나만 있는줄 알았는데

swift에는 프로퍼티에 get,set,didSet,willSet을 사용할 수 있대요! get/set을 쓰거나 didSet/willSet을 쓰거나 할 수 있다고 합니다.

 

get,set에 대해서는 간단하게 설명하고 넘어가겠습니다!

 

Get, Set

Swift의 get,set은 getter와 setter와 비슷하다고 합니다. 하지만 프로퍼티에 바로 get,set을 사용할 수 없고, 아래의 형태와 같이 실제 값을 저장할 backing storage가 필요합니다.

var getset: Int
var property: Int {
	get {
		return getset
	}
	set(newVal) {
		getset = newVal	
	}
}

즉 실제로 값이 저장된 getset 변수가 존재하고, 외부에서 property에 접근을 하면 실제로 값이 저장되는 곳은 getset입니다. 왜냐하면, getset이 없고 property에 값을 저장하는 형태로 코드를 작성하게 되면 recursive하게 자기 자신의 get,set을 호출하게 되서 안된다고 합니다....

 

그렇다면 get,set은 언제 사용할까요?

  1. 프로퍼티에 값이 할당 될 때 적절한 값인지 검증하기 위해
  2. 다른 프로퍼티값에 의존적인 프로퍼티를 관리할 때
  3. 프로퍼티를 private하게 사용하기 위해

 

didSet, willSet

Swift는 프로퍼티 옵저버로 didSet, willSet을 제공합니다. 이 둘의 역할은 프로퍼티의 값이 변경되기 직전, 직후를 감지하는 것입니다. (* 프로퍼티 옵저버는 프로퍼티 값의 변경을 모니터링 할 수 있습니다)

var property: Int = 10 {
	didSet(oldVal) {
		//property의 값이 변경된 직후의 호출, oldVal은 변경전 property의 값
	}
	willSet(newVal){
		//property의 값이 변경되지 직전에 호출, newVal은 변경 될 새로운 값
	}
}

💡 참고로 프로퍼티 옵저버를 사용하기 위해서는 프로퍼티의 값이 반드시 초기화 되어 있어야 합니다. 💡

→ didSet, willSet은 초기화 이후부터 프로퍼티를 감시합니다.

 

프로퍼티의 가장 빈번한 사용은 Model에서 갱신된 값을 View에 보여줄 때 입니다.(feat. MVC 패턴)

예를 들어 값이 바뀔 때 마다 값을 갱신해줘야하는 경우 아래와 같이 사용할 수 있습니다.

var count: Int = 0 {
	didSet {
		countLabel.text = "Count: \\(count)"		
	}
}

 

프로퍼티 옵저버를 사용해서 현재값과 이전값을 비교할 수도 있습니다.

var count: Int = 0 {
	didSet(oldVal) {
		print("현재 점수는 : \\(self.count), 이전 점수는 : \\(oldVal)")	
	}
}

 

 

아래의 블로그를 통해서 공부 했습니다! 자세한 내용은 아래의 블로그에서 공부 하세요!

https://medium.com/ios-development-with-swift/프로퍼티-get-set-didset-willset-in-ios-a8f2d4da5514

댓글