본문 바로가기
Swfit

Property Wrapper 알아보기

by GGShin 2023. 10. 3.

@가 붙어있는 애노테이션을 Swift에서는 Property Wrapper라고 부릅니다.

Property wrapper 변수에 접근하는 방법은 세 가지가 있는데, 각각의 차이점에 대해서 알아보려고 합니다.

 

예를 들어서, myName이라는 변수에 @Binding Property wrapper를 붙여주겠습니다.

@Binding var myName: String

이제 myName이라는 변수에 접근할 때,

1. self.myName

2. self._myName (wrapped value)

3. self.$myName (projected value)

이렇게 세 가지 방식으로 접근이 가능합니다.

 

첫번째 방식은, Binding<String> 자체에 접근할 수 있게 해줍니다. @Binding은 structure형태 입니다. 그렇기 때문에 self.myName을 사용하면, Binding<String> 이라는 structure에 접근하게 됩니다.

 

두번째 방식은, self._myName.wrappedValue에 접근하게 합니다. 예시로 보자면 String에 접근하게 되는 것입니다. 

 

세번째 방식은, self._myName.projectedValue에 접근하게 합니다. 예시로 보자면 첫번째와 마찬가지로 Binding<String>에 접근하게 됩니다.

🏷 첫번째와 세번째 방식으로 접근한 값의 타입이 같은 이유는 @Binding이 그렇게 정의되어 있기 때문입니다. 모든 property wrapper가 동일한 것은 아닙니다. 어떤식으로 propety wrapper가 구성되어 있는지에 따라 다릅니다.@Binding은 access level에만 차이가 있을 뿐 값 자체는 첫번째와 세번째가 동일합니다. 

 

두번째 세번째 방식을 조금 더 쉽게 이해하려면 property wrapper을 만드는 방법에 대해 알아야 합니다. 

Swift Document에 아래와 같은 예제가 있습니다.

@propertyWrapper
struct SmallNumber {
    private var number: Int
    private(set) var projectedValue: Bool

    var wrappedValue: Int {
        get { return number }
        set {
            if newValue > 12 {
                number = 12
                projectedValue = true
            } else {
                number = newValue
                projectedValue = false
            }
        }
    }


    init() {
        self.number = 0
        self.projectedValue = false
    }
}

SmallNumber라는 property wrapper를 만드는 코드입니다. 이렇게 만들어 두면, 어딘가에서 프로퍼티 앞에 @SmallNumber 라고 붙여서 사용할 수 있게 됩니다. 

코드를 보면 SmallNumber라는 structure 내부에는 wrappedValue와 projectedValue가 있습니다. 정의된 wrappedValue는 under score("_")를, propertyValue는 dollar sign("$")을 프로퍼티 이름 앞에 붙여서 접근할 수 있는 것입니다.

 

@SmallNumber var myNumber: Int = 10

 

이라고 선언된 변수라면, 

1. self.myNumber로는 10

2. self._myNumber로는 10

3. self.$myNumber로는 false

라는 값을 확인할 수 있는 것입니다.

 

 

참고 자료

https://stackoverflow.com/questions/65209314/what-does-the-underscore-mean-before-a-variable-in-swiftui-in-an-init

 

What does the underscore mean before a variable in Swiftui in an init()?

What does the underscore mean before momentDate? Why is it needed?

stackoverflow.com

https://docs.swift.org/swift-book/documentation/the-swift-programming-language/properties/#Projecting-a-Value-From-a-Property-Wrapper

반응형