SwiftUI @StateObject
(공식문서 링크)
https://developer.apple.com/documentation/swiftui/stateobject
Apple Developer Documentation
developer.apple.com

@StateObject 를 적용해 ObservableObject 프로토콜을 채택하고 있는 객체를 View, App 또는 Scene에서 객체를 생성함
@StateObject var model = DataModel()
SwiftUI에서는 객체를 선언하는 인스턴스에 대해 한 번만 객체의 새 인스턴스를 생성.
관찰 가능한 객체의 속성이 변경되면 SwiftUI는 해당 속성에 의존하는 뷰의 일부를 업데이트
Text(model.title) // Updates the view any time `title` changes.
ObservedObject 속성을 이용해서 있는 속성에 State 객체를 전달할 수 있음.
다른 방법으로는 environmentObject(_:) modifier를 적용함으로서 뷰의 계층에 환경에 적용할 수 있음.
ContentView()
.environmentObject(model)
위의 코드에서 보다시피 만약 environment object를 생성하게 되면 ContentView 안에 있는 객체 또는 그것의 하위 계층에 어디서든 EnvironmentObject 속성을 읽을 수 있음.
여기서 잠깐! State와 Binding을 이용한 기법과 environmentObject를 사용하는 것과의 차이
- State와 Binding은 주로 1:1 상황에서 유용
- 다만, 하나의 변수가 여러 하위 계층을 건너가야 하는 경우 State와 Binding으로 만들어두면 너무 불편하기에 이 경우에 사용하는 것이 Environment

@EnvironmentObject var model: DataModel
$ 연산자를 사용하여 관찰 가능한 State 프로퍼티 중 하나에 대해서 @Binding을 통해 관찰함.
@Binding은 양방향으로 연결해주면 UI Toggle에서 상태를 제어 가능함.
> (개인의견) UI의 상태가 단방향이면 한번 거쳐서 처리해야 하는데 이래서 양방향으로 설계 되었구나.
Toggle("Enabled", isOn: $model.isEnabled)
'apple > SwiftUI, Combine' 카테고리의 다른 글
| Swift Combine Networking (0) | 2022.06.11 |
|---|---|
| Combine 빠르게 공부 정리 (0) | 2022.06.03 |
| SwiftUI State and Data Flow (0) | 2022.06.02 |
| iOS 화면 캡쳐 및 녹화 감지 (feat. SwiftUI) (0) | 2022.06.02 |
| SwiftUI ViewModifier (0) | 2022.06.02 |