본문 바로가기
🍎 Swift/iOS 문법 노트

[🍎 Swift 문법] 프로퍼티 옵저버

by 솔비님 2024. 6. 11.

 

01. didSet

- 프로퍼티 값이 저장(변경)된 직후에 호출

- 이전 프로퍼티의 값이 기본 매개변수 이름인 'oldValue' 로 제공

 

02. willSet

- 프로퍼티 값이 저장(변경)되기 직전에 호출

- 새로운 프로퍼티의 값이 기본 매개변수 이름인 'newValue' 로 제공

 

var exampleProperty: Int = 0 {
    willSet(newExampleValue) {
        print("값이 \(exampleProperty)에서 \(newExampleValue)로 변경될 예정입니다.")
    }
    didSet {
        print("값이 \(oldValue)에서 \(exampleProperty)로 변경되었습니다.")
    }
}

exampleProperty = 10

 

코드 설명

 

1.  exampleProperty = 10을 실행하면 먼저 willSet이 호출됨

해당 시점에서 exampleProperty의 현재 값은 0
exampleProperty 값을 10으로 변경 요청
새로 설정될 값인 10이 newExampleValue 에 담김

 

 

2.  willSet 블록 내 print 문이 출력됨

 

3. 그런 다음에 프로퍼티 값이 실제로 변경됨

exampleProperty = 0 → 10

 

4. 값이 변경된 후 didset 호출

* 해당 시점에서 oldValue 는 이전 값인 0이 됨

* 변경된 값인 10은 exampleProperty 에 담김

* didSet 블록 내 print 문이 아래와 같이 출력됨

 


 

질문사항 - 튜터님께 물어보고 질문하고 내용 남기기

 

1. 프로퍼티 옵저버는 반드시 프로퍼티 아래에 위치하는 건지 하는 지 궁금합니다
-마지막 프로퍼티 바로 아래에 붙어야 하는지?

: 맞다. 프로퍼티 범위 안에 속해야 한다

연산 프로퍼티처럼 Int 프로퍼티 내 속해있는 것으로 이해해야함(프로그래밍 약속)

 

 

2.  동일한 예제에서 didSet 매개변수명이 생략 되었는데, 생략한 이유가 뭔지 궁금합니다

찾아 보았을 때 매개변수명을 지정하지 않으면 기본 이름인 'oldValue'로 제공된다고 했는데 생략한 것이랑 어떤 차이가 있는지 궁금합니다

 

3. 스파르타 심화 강의(1강) 자료에서 예시코드 내용 중 빨간색 부분과 노란색 부분 매개변수명이 다른데 이게 어떤 의미인지 궁금합니다 ㅠㅠ! (두개가 같은 게 아닌가요??)

 

: (2-3 공동답변) 두 가지 표현 방법이 있는 것이다 

- 매개변수명 지정해서 표기

didSet(oldVal)

willSet(newVal)

 

- 또는 생략하여 기본 프로퍼티명 oldValue/newValue 표기

didSet {

    print ("~~~~~~~ \(oldValue)")