Source of truth
앱에서 정보를 여러 번 복사해서 관리하면 값의 변동이 예상치 못한 상황에 발생하고 버그로 이어지는 상황이 있습니다
이를 피하기 위해서 각 데이터 요소에 대해서 단일 Source of Truth를 사용할 수 있습니다
데이터 요소를 한 곳에 저장하고 여러 뷰에서 동일한 데이터가 접근할 수 있도록 하는 방법입니다
앱 내부 코드 곳곳에 만들 수 있고 어디에 정의할 지는 데이터가 여러 뷰에서 공유되는지 데이터가 변하는지에 따라서 달라질 수 있습니다
Swift property wrappers
Swift에서 속성 래퍼를 사용해서 속성 초기화 패턴을 캡슐화하고 프로퍼티에 동작을 효율적으로 추가할 수 있도록 도와줍니다
@State, @Binding 프로퍼티 래퍼를 사용하여 뷰가 쉽게 액세스할 수 있는 소스를 유지하도록 도와주고 있습니다
State
속성을 @State로 선언하게되면 뷰 내에서 속성 값에 따라 달라지는 뷰의 모든 요소를 파악합니다
유저와 상호 작용으로 인해서 @State 속성 값이 변경될 수 있고 종속된 모든 뷰를 업데이트된 새 인터페이스 화면을 랜더링하게 됩니다
@State는 구조체와 열거형과 같은 값 유형에서만 사용이 가능합니다
State 속성 값이 변경되면 시스템은 업데이트 속성 값을 사용해서 뷰를 자동으로 다시 그리게 됩니다
예를 들어서 사용자가 어떤 값을 수정하게 되면 해당 뷰는 업데이트된 값을 표시하도록 목록을 다시 그리게 됩니다
State 속성은 버튼의 하이라이트 상태, 필터 설정, 현재 선택된 목록 항목과 같은 일시적인 상태 관리하는데 도움이 되므로 상태 속성을 private로 선언하고 영구적으로 저장하는 목적은 사용하지 않도록 하세요
State 프로퍼티 래퍼는 뷰 구조에 로컬 변경 가능한 소스를 정의하기 위한 SwiftUI 구문입니다
하지만 현재 뷰에서 다른 뷰로 전환할 때 동일한 데이터 소스를 사용하려면 어떻게 해야할까?
Binding
@binding 속성은 @State 속성처럼 기존 소스와 읽기 및 쓰기 액세스 권한을 공유하고 있습니다
@binding 데이터를 직접 저장하지 않고 기존 데이터 원본과 해당 데이터를 표시하고 업데이트하는 뷰 간의 양방향 연결을 만들고 있습니다
이러한 연결을 통해서 하나의 데이터와 관련된 여러 뷰가 동기화되도록 하고 있습니다
이러한 시스템은 @State 을 선언한 데이터와 @Binding을 포함하는 하위 간의 종속성을 설정해서
부모 또는 자식 둘 다 속성을 읽거나 수정할 수 있습니다
자식 뷰가 부모에 정의한 값을 자식 뷰에 선언하고 전달하기만 하면 됩니다. 두 경우 모두 프레임워크에서 두 뷰를 자동으로 업데이트하여 변경사항을 반영하고 있습니다
App architecture
바인딩을 사용하여 단일 소스를 전파하는 이 패턴은 뷰 계층 구조의 레벨의 수와 관계없이 유용하게 사용됩니다
@State 와 @Binding을 사용하여 자동으로 관련 뷰를 업데이트하여 기준 정보에 대한 변경 사항을 반영하기 때문에 효율적입니다
'SwiftUI' 카테고리의 다른 글
SwiftUI | Examining data flow in Scrumdinger (0) | 2024.08.06 |
---|---|
SwiftUI | Adopting new API features (0) | 2024.08.06 |
Adopting Swift concurrency (0) | 2024.08.05 |
SwiftUI | Responding to events (0) | 2024.08.02 |
Making classes observable (0) | 2024.08.02 |