처음 프로퍼티 옵져버를 보게 된것은 MVVM패턴을 공부하던 와중에 model view와 view controller를 binding하는 과정에서 API 요청을 받은 후에 요청값의 변화가 생겼을때 View Controller를 update하는 코드 분석할때 발견하게 되었습니다.
EmployeesViewModel의 타입의 객체 생성함과 API 요청을 하고 요청값을 객체의 프로퍼티에 전달 됩니다.
이때 변화하는 순간을 관찰하고 있다 didSet 이하의 코드가 실행이 되게 됩니다.
이처럼 프로퍼티의 변화하는 순간을 관찰하고 있다가 특정 시점(did 또는 will)에 맞추어 명령어의 아래에 정의된 코드를 실행하는 것이 프로퍼티 옵져버입니다.
swift 공식문서를 보면 자세히 설명되어 있습니다.
프로퍼티의 값의 변화를 관찰 그리고 응답합니다. 그리고 새로 변경되는 값이 현재 프로퍼티의 값과 같다고 하더라도 이것을 변화로 인식하여 응답합니다.
프로퍼티 옵져버는 자신 정의한 저장 프로퍼티와 내가 정의하지 않은 부모 클래스로부터 상속한 저장 프로퍼티(stored property), 연산 프로퍼티(computed property)에도 추가함으로써 값의 변화를 확인하고 그에 맞는 동작을 추가할 수 있습니다.
종류
willSet
swift의 많은 키워드를 보다보면 "will"이라는 단어가 많이 등장합니다.
이것은 어떤 변화가 일어나기 "직전"이라고 생각하면 좋을거 같습니다.
그렇게 따져보았을때, willSet은 프로퍼티의 값이 변화하기 직전에 응답을 정의하는 키워드입니다.
didSet
마찬가지로 did는 "직후"라고 생각했을때
didSet은 값이 변화하고 직후 응답을 정의하는 키워드입니다
아래는 간단한 프로퍼티 옵져버의 예시 코드입니다.
totalSteps이라는 저장 프로퍼티가 있고, 그 프로퍼티를 관찰하는 두개의 프로퍼티 옵져버가 있습니다.
willSet과 didSet은 값이 변경과 동시에 각각 변경 이후의 데이터 그리고 변경 이전의 데이터가 상수 파라미터(constant parameter)에 전달되게 됩니다.
willSet의 경우, 파라미터 newTotalSteps으로 이름을 정했고 이 파라미터로 변경된 값이 전달 됩니다.
willSet 같은 경우는 전달된 변경된 값과 위에 문자열을 출력하게 정의했습니다.
didSet의 경우는 기본 매개변수(oldValue)에 값이 변경되기 이전의 데이터가 전달 됩니다.
didSet의 아래 코드를 보면, 프로퍼티값이 변화하고 직후의 값과 예전의 값과 비교했을때 현재의 값이 클때 두 값의 차를 문자열과 함께 출력하는 코드를 작성했습니다.
만약에 totalSteps 프로퍼티에 200을 할당하게 된다면,
willSet은 "About to set totalSteps to 200"을 출력하고
didSet은 "added (200 - 0) steps"를 출력하게 됩니다.
'Swift🐤' 카테고리의 다른 글
Swift) 열거형(enum) (1) | 2023.10.09 |
---|---|
Swift) Nested Function (0) | 2023.09.06 |
Swift) collection types(and tuple) (0) | 2023.09.04 |
Swift) ARC(Automatic Reference Counting) (0) | 2023.09.01 |
Swift) swift 일급객체 (0) | 2023.07.13 |