Class Protocol로 ObservableObject를 채택하면 해당 클래스 인스턴스 관찰하다 값이 변경되면 뷰를 업데이트함(class형태만 가능)
- 대표적 예시 : @Published, @ObservedObject
SwiftUI를 사용하다 보면...
@Published
@Binding
@ObservedObject
@State
등등 이런 코드를 자주 접하게 되는데 이런 것들이 Property Wrapper다.
사용 예시
struct Person {
private var _name : String = ""
var name : String {
get {self._name.uppercased()}
set {self._name = newValue }
}
init(name : String) {
self.name = name
}
}
여기서 중요한 부분은 바로 uppercased()로직 -> 자동으로 get하는 경우 대문자로 변환
만약 해당 로직을 다른 부분에서도 사용해야 한다면???
해당 로직을 Property Wrapper로 만든다면 코드 재사용성이 높아진다.
@propertyWrapper
struct Uppercase{
private value : String = ""
var wrappedValue : String {
get { self.value }
set { self.value = newValue.uppercased() }
}
init(wrappedValue initValue : String) {
self.wrappedValue = initValue
}
}
@propertyWrapper를 통해 타입이 특별함을 알려준다.
이후 행동을 정의하는 타입을 만들고 반복되는 로직을 넣어준다.
추가
해당 개념을 이용해서 viewModel을 만들던 도중 Protocol을 사용하다 보니 생각보다 typealias를 많이 사용하게 되었습니다.