@가 붙어있는 애노테이션을 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
라는 값을 확인할 수 있는 것입니다.
참고 자료
'Swfit' 카테고리의 다른 글
JSON 동일한 key에 다른 type의 value가 있는 경우 인코딩/디코딩 하기 (0) | 2023.11.12 |
---|---|
ActivityKit으로 Dynamic Island 만들어보기! (0) | 2023.10.21 |
JSONSerialization 사용방법 (0) | 2023.09.30 |
UIButton 탭 시 image 색상 변경되지 않도록 설정하기 (0) | 2023.07.22 |
iOS App 제출 시 iPad 스크린샷 제외 (0) | 2023.05.14 |