[Swift] ProperyWrapper를 이용한 값처리

Harry The Great
해리의 유목코딩
3 min readFeb 14, 2020

PropertyWrapper란 Swift5.1부터 추가된 기능입니다. Annotation을 활용하여 감싸져(Wrapping)되어있는 값을 사용하는 개념입니다. 사실 용어와 원리가 어렵지 실제 사용하는 구현레벨에서는 생각보다 어렵지 않습니다. 먼저 우리에게 Int형 데이터가 필요하다고 가정해보겠습니다.

@WhateverDouble
var age:int

일반적인 값선언 이외에도 WhateverDouble이라는 Annotation을 선언하였습니다. 이제 age를 20으로 할당해보겠습니다.

age = 20

우리가 값을 20으로 할당했어도 하지만 age의 값은 곧바로 20이 되는 것이 아닙니다. age는 할당은 데이터를 WhateverDouble에서 처리하게됩니다.

WahteverDoubleProperyWrapper로 ‘’’@WhateverDouble’’’로 감싸 져 있는 데이터는 PropertyWrapper를 거치게 됩니다. 엄밀히 말하면 age는 Int형이 아닌 PropertyWrapper의 wrappedValue로 감싸 져 있는 값입니다. 도식화를 해보면 아래와 같습니다.

데이터의 할당과 동시에 WahteverDouble의 wrapperValue에 정의된 GET,SET대로 데이터를 처리한다음 할당하게됩니다. 더 추상화시켜 이야기하면 PropertyWrapper인 WhateverDouble이 실제값과 할당한값 사이에 위치하여 데이터의 값을 제어하는것처럼 동작합니다

전체코드

플레이그라운드에 바로 복붙하여 테스트해볼 수 있습니다

이번에는 조금 더 복잡한 예제를 들어보겠습니다. 지금까지는 랩핑된 wrappedValue에만 접근했지만 PropertyWrapper 자체에 접근할려면 어떻게해야할까요? 이전에 SwiftUI 연재에서구조체에 $를 붙이면 값뿐만 아니라 수정도 할 수 있다고 언급한적이 있습니다. 달러사인($)은 PropertyWrapper에 직접 접근하여 get,set을 거치지않고 값을 가져올 수 있습니다.

로그는 순서대로 20, 40, 20이 찍히게됩니다. 구조체가 아닌 클래스였다면 언더스코어(_)를 사용하면됩니다.

물론 실제 타입이 아닌 감싸진다는 뜻에서 PropertyWrapper라는 키워드도 좋지만 개인적으로 값을 위임한다는 뜻의 Property Delegation란 키워드가 저는 더 와 닿는 것 같습니다. 내용은 짧아보이지만 보일러 플레이트가 많이들어가는 코드를 작성할 때 유용합니다. 예를 들면 UserShared입니다.

userAge의 get과 set은 UserDefault라는 프로퍼티 래퍼에 위임되어있기 때문에 값의 입출력은 PropertyWrapper로부터 할 수 있습니다. 이외에도 Night Mode에 따른 다른 색상값을 받는다거나 혹은 TestCase의 Mocking 그리고 테스트 상황 케이스와 실제 프로덕션에 따른 다른 DI주입 등 여러 용도로 사용할 수 있습니다.

--

--

Harry The Great
해리의 유목코딩

Android & IOS Developer 😀 미디움 이외에 스니펫이나 디버그노트로 활용하는 https://www.harrymikoshi.com/ 블로그도 운영하고있습니다.