ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Property Wrapper
    Swift 2022. 4. 21. 10:11

    안녕하세요. 그린입니다🟢

    이번 포스팅에서는 Swift의 Property Wrapper를 알아보려합니다🙌

     

    Property Wrapper?

    Swift 5.1에서 처음 소개되어 추가된 기능으로 프로퍼티를 감싸 특별한 타입으로 만들어주는 친구입니다.

    뒤에서 천천히 같이 학습해보겠지만 우선 찍먹해보면 프로퍼티에 커스텀한 어떤 로직들을 매번 동일하게 지정해주지 않고

    Property Wrapper로 만든 타입으로 프로퍼티를 선언해 동일 로직을 수행하도록 합니다!

    Property Wrapper는 특히 지역변수에서만 사용가능합니다🙌

    아마 다들 많이 보셨을것 같은 @UserDefaults, @State, @Binding 등등 되게 많은 이러한 형태를 띈 친구들이 Property Wrapper라고 볼 수 있습니다.

    저는 특히 스유에서 많이 보고 있네요😀

     

    Property Wrapper가 없다면?

    우선 Propery Wrapper의 장점을 알려면 이게 없었을때의 단점도 알아야겠죠?

    선코드 후이해 ㄱㄱ

    struct House {
      private var width = 0
      var size: Int {
        get { return width }
        set { width = pow(newValue, 2) }
      }
    }
    
    struct KoreaHouse {
      private var _apartment = House()
      private var _villa = House()
      
      var apartmentSize: Int {
        get { return _apartment.size }
        set { _apartment.size = newValue }
      }
      var villaSize: Int {
        get { return _villa.size }
        set { _villa.size = newValue }
      }
    }

    자 만약 집의 사이즈를 가지는 House 타입이 있다고 가정해봅시다.

    이렇게 정의해준 타입을 KoreaHouse 구조체 내에서 각 프로퍼티에서 매번 동일한 보일러 플레이트 코드를 작성해야되요.

    이게 지금은 괜찮지만 프로퍼티가 많아지고 다른 타입에서도 쓰이고 한다면 되게 불필요한 작업이 될거에요!

    즉, 이런 중복 로직들을 Propery Wrapper를 붙여 한번만 정의해주면 이후 다른 프로퍼티들에서 해당 Property Wrapper를

    적용하면 깔끔하게 코드를 재사용할 수 있습니다👍

     

    Propery Wrapper 정의

    Propery Wrapper는 프로퍼티를 가지는 타입 앞에 붙여줍니다.

    프로퍼티를 가지는 타입이라함은 Class, Struct, Enum이 있겠죠?

    @propertyWrapper
    struct House {
      private var width = 0
      var size: Int {
        get { return width }
        set { width = pow(newValue, 2) }
      }
    }

    이렇게 붙여줍니다. 아주 간단하죠!

    아 물론 타입이니 초기값을 줄수도 있습니다!

    @propertyWrapper
    struct House {
      private var width = 0
      var size: Int {
        get { return width }
        set { width = pow(newValue, 2) }
      }
      
      init(size: Int) {
        width = pow(newValue, 2)
      }
    }

     

    그럼 이제 이런 장점을 지닌 Property Wrapper가 실제로 어떻게 쓰이는지 봐보시죠!

     

    Property Wrapper 사용하기

    struct KoreaHouse {
      @House var apartment: Int
      @House var villa: Int
    }
    
    var koreaHouse = KoreaHouse()
    koreaHouse.apartment = 20
    koreaHouse.villa = 30
    
    print(koreaHouse.apartment, koreaHouse.villa)
    // 400, 900

    자 KoreaHouse 타입을 만드는데 아주아주 간단해졌습니다😀

    만약 위에 propertyWrapper 구현 시 이니셜라이저를 지정해줬다면 KoreaHouse에서도 초기값으로 사용 가능합니다!

    struct KoreaHouse {
      @House var apartment: Int = 20
      @House var villa: Int = 30
    }
    
    var koreaHouse = KoreaHouse()
    print(koreaHouse.apartment, koreaHouse.villa)
    // 400, 900

    더 명료하게 사용할수도 있고 편리한 방법으로 사용하면 됩니다!

    핵심은 보일러 코드가 제거 되었고 사용성이 증대했다는점이 있습니다🙌

     

    @State도 Property Wrapper였어😄

    SwiftUI에서 State 타입을 까보면 아래와 같이 @propertyWrapper 딱지가 붙어있는걸 볼 수 있습니다.

    즉 이 친구도 중복 로직 코드를 propertyWrapper로 정리했다 볼 수 있겠습니다!

    @frozen @propertyWrapper public struct State<Value> : DynamicProperty {
      public init(wrappedValue value: Value)
    
      public init(initialValue value: Value)
    
      public var wrappedValue: Value { get nonmutating set }
        
      public var projectedValue: Binding<Value> { get }
    }

    요렇게 주석 제거하면 구현이 되어 있어요.

    새로 접한건 projectedValue인데 이건 다음 포스팅에서~

     

    마무리

    와.. Property Wrapper 대충만 알고 있었고 구현까지는 잘 몰랐었나봅니다ㅠ

    이래서 대충 아는게 더 무섭다니까요🤯

    그래도 오늘 Swift 지식 +1이 된것 같아 뿌듯한 하루를 시작할 수 있겠습니다✨

     

    [참고자료]

    https://docs.swift.org/swift-book/LanguageGuide/Properties.html#ID617

     

    Properties — The Swift Programming Language (Swift 5.6)

    Properties Properties associate values with a particular class, structure, or enumeration. Stored properties store constant and variable values as part of an instance, whereas computed properties calculate (rather than store) a value. Computed properties a

    docs.swift.org

    https://github.com/apple/swift-evolution/blob/master/proposals/0258-property-wrappers.md

     

    GitHub - apple/swift-evolution: This maintains proposals for changes and user-visible enhancements to the Swift Programming Lang

    This maintains proposals for changes and user-visible enhancements to the Swift Programming Language. - GitHub - apple/swift-evolution: This maintains proposals for changes and user-visible enhance...

    github.com

    'Swift' 카테고리의 다른 글

    Swift5.6 - existential any  (0) 2022.05.02
    Result (With. Composable Architecture)  (0) 2022.04.25
    Method Swizzling  (0) 2022.01.14
    Swift - Markdown  (2) 2021.10.20
    KeyPath  (0) 2021.09.04
Designed by Tistory.