본문 바로가기

Swift

Swift - Properties - Property Wrappers

오늘 공부할 것은 Property Wrapper입니다


이번에는 간단한 개념과 사용방법에 대해서 알아보도록 할게요

1. 기본 개념

property wrapper는 프로퍼티를 저장 방법을 관리하는 코드와 프로퍼티를 정의하는 코드 사이에 분리하는 계층을 추가한다

네가 property wrapper를 사용할 때 너는 관리 코드(management code)를 wrapper를 정의할 때 한번 작성하고 다수의 프로퍼티에 관리 코드를 재사용하면 된다

property wrapper를 작성하기 위해서 너는 wrappedValue 프로퍼티를 정의한 struct, enumeration, classs을 만들어야 한다

 

2. 사용방법

애플 문서에 나와있는 예제를 가지고 설명해 드리겠습니다

@propertyWrapper
struct TwelveOrLess {
    
    private var number : Int
    
    init() {
        self.number = 0
    }
    
    var wrappedValue : Int {
        get {
            return self.number
        }
        set {
            number = min(newValue, 12)
        }
    }
}

위에 예제에서 보시면 struct TwelveOrLess 위에 @propertyWrapper를 작성하여 주시면 됩니다

이제 위에 코드가 관리 코드라고 보시면 됩니다

 var wrappedValue라는 변수를 생성하여 주지 않으면 오류가 나니 꼭 만들어 주셔야 합니다

(1)

struct SmallRectangle {
    @TwelveOrLess var height : Int
    @TwelveOrLess var width : Int
}

var smallRectangle = SmallRectangle()

print(smallRectangle.height, smallRectangle.width) //출력 : 0 0

smallRectangle.height = 10
smallRectangle.width = 13

print(smallRectangle.height, smallRectangle.width) //출력 : 10 12

위에 코드에서 보듯이 height, width 변수 앞에 @TwelveOrLess를 선언해 줌으로써 propertywrapper를 적용해 줄 수 있습니다

SmallRectangle의 프로퍼티들은 property wrapper의 TwelveOrLess.number의 0의 값으로 초기화가 되게 됩니다

 

smallRectangle.height 와 smallRectangle.width에 10과 13값을 차례대로 할당해 주었는데

10은 제대로 수정이 되었는데 13값은 12 값으로 바뀌어서 저장이 되었습니다

그 이유는 property wrapper때문입니다

property wrapper의 wrappedValue에는 set값이 12 이하의 값만 취하도록 되어 있기 때문에

13은 12로 변경되어서 저장이 되게 되는 겁니다

 

(2)

struct SmallRectangle {
    private var _height = TwelveOrLess()
    private var _width = TwelveOrLess()
    
    var height : Int {
        get {
            return _height.wrappedValue
        }
        set {
            _height.wrappedValue = newValue
        }
    }
    
    var width : Int {
        get {
            return _width.wrappedValue
        }
        set {
            _width.wrappedValue = newValue
        }
    }
}

첫 번째 코드처럼 property wrapper를 적용해도 되지만

두 번째 코드처럼 property wrapper를 적용해도 됩니다

제가 느끼기에는 첫 번째 방식은 작성하기에 편하고

두 번째 방식은 적힌 코드를 봤을 때 이해하기가 더 편한 것 같습니다

편한 대로 쓰시면 될 것 같습니다


여기까지가 Property Wrapper에 대한 기본적인 글이었습니다

읽으셨을 때 부족한 부분이나 잘못된 부분이 보이신다면 댓글로 남겨주시면 감사하겠습니다

읽어주셔서 감사합니다~!

'Swift' 카테고리의 다른 글

Closure - Capture List  (0) 2020.07.17
Swift - Protocols Method 요구사항  (0) 2020.03.12
Swift - Protocols Property 요구사항  (0) 2020.03.08
Swift - Protocols 기본개념  (0) 2020.03.07