apple/SwiftUI, Combine

SwiftUI @StateObject

lgvv 2022. 6. 2. 20:56

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