어떤 데이터 프로퍼티 래퍼를 써야 적당한 데이터 접근이 가능한가?
데이터가 변할 때마다 뷰를 바꿔야 한다.
이러한 데이터 의존성은 꽤 복잡하지만, SwiftUI의 API가 많은 도움을 준다.
뷰의 계층에서 각 데이터는 지속가능한 모델에서 Single Source of Truth 를 갖는다.
이 모델이 복제되면 하나의 모델 내부의 데이터가 원치않는 변화를 겪을 수 있기 때문에 하나의 모델을 갖고 그 모델에서 데이터를 보관하는 것은 중요하다.
모든 @State
는 Source of Truth가 된다.
뷰는 이 State의 작용으로서 계속해서 새롭게 그려진다.
@Binding
은 데이터를 갖지 않고, 읽고 변형하는 역할을 할 때 적절한 도구가 된다.
이 경우, State
의 참조를 갖게 되며(get reference), 그 복사된 값을 갖지 않는다.
바인딩 값의 변화에 따라 애니메이션을 넣어서 뷰를 새로 그리게 하고 싶다면, 그 바인딩 값을 변화시키는 로직을 witnAnimation{}
로 감싸면 된다.
.onReceive()
: 데이터 의존을 개발자가 직접 이어주기 위해 사용할 수 있는 메소드.
class SomeClass: BindableObject {
var didChange = PassthroughSubject<Void, Never>()
func doSth() {
...
didChange.send()
}
}
@ObjectBinding
을 활용할 수 있다.@EnvironmentObject
가 좋은 도구가 된다.@State
: 뷰 스코프에서 작동하며 프레임워크에 의해 관리된다. 값타입이다.@BindableObject
: 개발자가 직접 관리해야 하며, 참조 타입이다.First Class reference to Data, Great for resuability