SwiftUI에서는 @State
, @Binding
, @ObservedObject
, @EnvironmentObject
와 같은 방법을 사용하여 뷰의 상태를 관리할 수 있습니다. 이러한 상태 속성을 사용하면 뷰가 특정 데이터나 상태를 감시하고 감지하여 변경할 수 있게 됩니다.
@State 속성
@State
속성은 값이 변경될 때 뷰를 다시 생성하도록 하는 속성입니다. 이 속성은 값이 변경되는 것을 관찰하여 자동으로 화면을 갱신합니다. @State
속성은 보통 단일 뷰 내에서 사용되며 해당 뷰에 종속적입니다.
@State private var count = 0
//...
Text("Count: \(count)")
Button("Increment") {
count += 1
}
@Binding 속성
@Binding
속성은 뷰 외부에서 값을 전달 받아 뷰 내부에서 수정 및 사용할 때 사용됩니다. 이 속성을 사용하면 부모 뷰에서 하위 뷰로 데이터를 전달하고 그 값을 변경하여 부모 뷰에서도 실시간으로 반영할 수 있습니다.
struct ContentView: View {
@State private var count = 0
var body: some View {
ChildView(count: $count)
}
}
struct ChildView: View {
@Binding var count: Int
var body: some View {
Text("Count: \(count)")
Button("Increment") {
count += 1
}
}
}
@ObservedObject 속성
@ObservedObject
속성은 동일한 속성을 가진 객체의 변경 사항을 감시합니다. 이 속성을 사용하면 변경 사항이 발생할 때마다 뷰를 자동으로 갱신할 수 있습니다.
class DataModel: ObservableObject {
@Published var data: String = ""
}
struct ContentView: View {
@ObservedObject var model = DataModel()
var body: some View {
TextField("Enter data", text: $model.data)
Text("You entered: \(model.data)")
}
}
@EnvironmentObject 속성
@EnvironmentObject
속성은 전역적으로 사용될 수 있는 값을 나타냅니다. 이 속성을 사용하면 어떤 뷰에서든 동일한 값에 접근하여 변경할 수 있습니다.
class UserData: ObservableObject {
@Published var username = "jsmith"
}
struct ContentView: View {
@EnvironmentObject var userData: UserData
var body: some View {
Text("Username: \(userData.username)")
}
}
결론
SwiftUI에서 뷰의 상태를 관리하여 상태가 변경될 때마다 자동으로 갱신되도록 하려면 @State
, @Binding
, @ObservedObject
, @EnvironmentObject
를 사용하여 감시 및 감지할 수 있습니다. 각각의 속성은 특정한 상황에 맞게 사용되므로 앱의 기능과 요구 사항에 맞게 선택하여 사용해야 합니다.