KoreaMango 나무

[iOS App Dev Tutorials] SwiftUI - State Management (1) 본문

iOS/iOS App Dev Tutorials

[iOS App Dev Tutorials] SwiftUI - State Management (1)

KoreaMango 2022. 5. 18. 18:57
 

Apple Developer Documentation

 

developer.apple.com

1. Making Classes Observable

Working with Reference Type

이전 챕터에서는 @State, @Binding property wrappers를 사용하여 View 계층에서 업데이트를 트리거하기 위해 진실 소스를 정의했다. 이번에는 앱의 UI에 대한 진실 소스로서 참조 유형을 정의하는 것을 알아본다.

@State 은 오직 structures 나 enumerations 같은 Value type (값 타입)에만 작동한다.

SwiftUI는 @ObservedObject, @StateObject, @EnvironmentObject 같은

reference type (참조 타입) 을 진실 소스로 선언하는 property wrappers를 제공한다.

Making a Class Observable

class 에서 property wrappers를 사용하기 위해서는 class observable를 만들어야 한다.

ObservableObject protocol을 적용함으로써 class observable을 만들 수 있다.

UI가 변경될 때 트리거 해야하는 속성을 선택하고 @Published 를 붙인다.

class ScrumTimer: ObservableObject {
   @Published var activeSpeaker = ""
   @Published var secondsElapsed = 0
   @Published var secondsRemaining = 0
   // ...
}

Monitoring an Object for Changes

SwiftUI에서 @ObservedObject, @StateObject, or @EnvironmentObject 속성중 하나를 추가하여 관찰 가능한 개체를 모니터링 한다. 이러한 wrappers 중 하나로 선언된 view property는 View 계층에 새로운 진실 소스를 만든다.

@StateObject wrapper는 view에서 observable object를 만든다.

시스템은 view를 만들 때 object를 초기화하고, object를 전달하는 해당 view 또는 다른 view에서 object를 사용할 수 있도록 유지한다.

struct MeetingView: View {
   @StateObject var scrumTimer = ScrumTimer()
   // ...
}

@ObservedObject property wrapper를 사용해 다른 View에 객체를 전달했음을 나타낸다. 다른 view에서 객체가 생성되기 때문에, 객체의 초기 값을 제공하지 않는다.

struct ChildView: View {
   @ObservedObject var timer: ScrumTimer
   // ...
}

다음 observable object의 인스턴스를 를 view 이니셜 라이저에 전달한다.

struct MeetingView: View {
   @StateObject var scrumTimer = ScrumTimer()
   var body: some View {
      VStack {
         ChildView(timer: scrumTimer)
      }
   }
   // ...
}

object를 개별 view에 전달하는 대신에 환경에다가 object를 배치할 수 있다.

environmentObject view 한정자는 object 환경의 부모 view에 배치한다.

struct ParentView: View {
   @StateObject var scrumTimer = ScrumTimer()
   var body: some View {
      VStack {
         ChildView()
            .environmentObject(scrumTimer)
      }
   }
   // ...
}

그 다음 계층중에 중간 view에 object의 참조가 없더라도 @EnvironmentObject property wrapper를 사용하여 부모 view의 자식 계층도 object를 사용할 수 있다.

SwiftUI는 데이터를 읽는 View에서 종속석만을 추적한다.

struct ChildView: View {
   @EnvironmentObject var timer: ScrumTimer
   // ...
}

@EnvironmentObject에 대해 더 배우고 싶다면 아래 링크로 가면 된다.

https://developer.apple.com/documentation/swiftui/managing-model-data-in-your-app

 

Apple Developer Documentation

 

developer.apple.com