-
[SwiftUI] Model data 앱 데이터 관리하기SwiftUI 2022. 11. 25. 18:47반응형
아래 문서를 읽고 정리한 글입니다.
https://developer.apple.com/documentation/swiftui/model-data
Apple Developer Documentation
developer.apple.com
Overview
SwiftUI는 선언적인 UI 접근 방식을 제공합니다. 뷰 계층을 구성할 때 뷰에게 관련된 데이터 의존성을 알려줍니다.
그럼 외부 이벤트나, 사용자 액션으로 데이터가 바뀔 때, SwiftUI 는 자동으로 영향이 미치는 부분을 업데이트 합니다.
결과적으로 SwiftUI 프레임워크는 자동으로 이전에 뷰컨트롤러가 했던 대부분의 일을 수행합니다.https://docs-assets.developer.apple.com/published/4fee13b0ffd4854249fa6d4740449865/State-and-Data-Flow-1@2x.png SwiftUI 프레임워크는 데이터와 UI를 연결하기 위해 state variables, bindings 같은 도구를 제공합니다.
이런 도구들은 직접 처리해야 하는 부분을 줄여줌으로써 앱 내의 데이터가 SSOT (single source of truth) 를 유지할 수 있도록 도와줍니다.
필요한 작업에 따라 제일 적절한 도구를 선택해서 사용하면 되겠습니다.- @State > UI 상태를 지역적(locally)으로 관리합니다
- @ObservedObject > ObservableObject 프로토콜을 채택한 외부 reference 모델 데이터와 연결합니다 @EnvironmentObject 를 사용해 해당 환경에서 observable object 에 접근할 수 있습니다.
StateObject 를 사용하여 뷰에서 observable object 를 직접 인스턴스화합니다. - @Binding > state 나 observable object 같은 SSOT 래퍼런스를 공유합니다.
Leveraging property wrappers
SwiftUI는 State, Binding 처럼 많은 데이터 관리 타입들을 property wrappers 로 구현합니다.
프로퍼티 선언부에서 래퍼(wrapper)의 이름 앞에 attribute 를 붙여서 적용합니다.@State private var isVisible = true // isVisible을 state 변수로 선언
이 프로퍼티는 래퍼가 지정한 속성을 가져옵니다. state and data flow 프로퍼티 래퍼는 데이터의 변화를 관찰하고 있다가 자동으로 영향을 받는 뷰들을 업데이트 합니다. 속성을 직접 참조하면 wrapped 된 값에 접근합니다. 위 예에서 isVisible 은 Bool 값이 저장되어 있습니다.
if isVisible == true { Text("Hello") // isVisible 가 true 일 때만 뷰를 그린다. }
또는 $ 을 앞에 붙여 state and data flow 프로퍼티 래퍼의 projected value 에 접근할 수 있습니다. state and data flow 프로퍼티 래퍼는 Binding 을 투영하는데, 이는 wrapped 된 값을 양방향으로 연결 하는 걸 의미하고, 다른 뷰가 SSOT (single source of truth) 를 변경할 수 있도록 합니다.
Toggle("Visible", isOn: $isVisible) // The toggle can update the stored value.
---
요약.
SwiftUI 는 선언적인 UI 방식을 제공한다.
뷰를 그릴 때 관련 데이터를 주입하고 데이터가 바뀌면 이에 따라 자동으로 뷰가 업데이트 될 수 있도록 함.
이걸 위해 @State, @Binding, @Enviornment, ... 같은 프로퍼티 래퍼들을 만들어두었음.직접 참조(사용)하면 저장된 값 (wrapped value)에 접근할 수 있고
$ 를 앞에 붙이면 projected value 에 접근할 수 있다.반응형'SwiftUI' 카테고리의 다른 글
[SwiftUI] HStack 하위 요소 > 최대 높이로 동일하게 맞추기 (0) 2023.05.22 task(priority:_:) (0) 2023.01.28 StateObject (0) 2023.01.28 ObservedObject (0) 2023.01.28 ObservableObject (0) 2023.01.28