[swift] SwiftUI 뷰의 상태 감시

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를 사용하여 감시 및 감지할 수 있습니다. 각각의 속성은 특정한 상황에 맞게 사용되므로 앱의 기능과 요구 사항에 맞게 선택하여 사용해야 합니다.

참고 자료