안녕하세요, GraceKim입니다! 🍎
이번에는 4차시로 State Management에 대하여 정리해보고자 합니다.
일반적으로 클래스의 속성이 변경되면 SwiftUI는 해당 변경 사항을 감지할 수 없는데, ObservableObject
프로토콜을 채택하면 @Published
속성 래퍼를 사용하여 특정 속성을 관찰하게끔 만들면, 해당 속성이 변경될 때마다 SwiftUI에게 알리고 UI를 업데이트할 수 있게끔 합니다.
예를 들어,
import SwiftUI
class MyViewModel: ObservableObject {
@Published var name: String = "Gracekim"
@Published var age: Int = 22
}
이제 MyViewModel 클래스의 인스턴스를 사용하는 SwiftUI 뷰에서 @ObservedObject
속성 래퍼를 사용하면 해당 뷰는 MyViewModel의 변경사항을 감지하고 자동으로 업데이트됩니다.
struct MyView: View {
@ObservedObject var viewModel = MyViewModel()
var body: some View {
VStack {
Text("Name: \(viewModel.name)")
Text("Age: \(viewModel.age)")
}
}
}
이렇게 하면 viewModel의 name, age 속성의 변경을 실시간으로 감지합니다.
ObservedObject
, StateObject
, 또는 EnvironmentObject
중 하나를 속성 선언에 추가하여 SwiftUI가 객체를 모니터링할 수 있습니다.
struct ChildView: View {
@ObservedObject var timer: ScrumTimer
// ...
}
struct MeetingView: View {
@StateObject var scrumTimer = ScrumTimer()
var body: some View {
VStack {
ChildView(timer: scrumTimer)
}
}
// ...
}
struct ParentView: View {
@StateObject var scrumTimer = ScrumTimer()
var body: some View {
VStack {
ChildView()
.environmentObject(scrumTimer)
}
}
// ...
}
struct ChildView: View {
var body: some View {
GrandchildView()
}
}
struct GrandchildView: View {
@EnvironmentObject var timer: ScrumTimer
// ...
}
environmentObject
뷰 수정자를 사용하여 환경에 객체를 추가한 후, 하위 뷰에서 @EnvironmentObject
로 해당 객체를 사용합니다.
@main
속성으로 앱의 진입점을 정의합니다.SwiftUI는 선언적 프로그래밍 방식을 채택합니다.
이부분에 대해서는 추후 블로그에 따로 정리해볼 예정입니다.
명령형 패턴은 프로그램 상태 변경에 대한 응답으로 뷰를 변이시키는 것을 필요로 하지만 SwiftUI에서는 뷰가 나타날 때마다 사용자 인터페이스가 어떻게 나타나야 하는지를 명시합니다.
실행 중에 시스템은 상태와 사용자 인터페이스를 동기화하여 상태 변경이 발생할 때마다 관련 부분을 업데이트합니다.
다음은 SwiftUI에서 생명주기 이벤트에 응답하는 modifiers입니다.
보기가 나타나거나 사라질 때 앱의 상태를 변경하는 작업을 수행할 수 있습니다. 사용자가 시작한 이벤트와 마찬가지로 SwiftUI는 뷰 계층 구조를 관리하고 업데이트된 상태를 반영하도록 사용자 인터페이스를 업데이트하여 상태를 변경합니다.