[swift] SwiftUI 뷰의 기억 제어

SwiftUI는 새로운 프레임워크로, 기억 속성을 사용하여 뷰를 업데이트할 수 있습니다. 때로는 뷰의 기억을 명시적으로 제어해야 할 필요가 있습니다. 이를 위해 SwiftUI에서는 @State, @Binding, @ObservedObject, @EnvironmentObject과 같은 속성 래퍼를 제공합니다.

@State

@State 속성 래퍼는 단일 뷰에 속하는 기억을 저장하는 데 사용됩니다. 예를 들어 토글 버튼의 상태를 유지하거나 입력 필드의 텍스트를 저장하는 데 사용됩니다.

struct ToggleView: View {
    @State private var isToggled: Bool = false
    
    var body: some View {
        Toggle("Toggle", isOn: $isToggled)
    }
}

@Binding

@Binding 속성 래퍼는 상위 뷰로부터 전달된 값을 수정할 때 사용됩니다. 예를 들어 상위 뷰에서 @State로 선언된 값을 하위 뷰에서 사용하고 수정할 때에는 @Binding을 사용합니다.

struct ParentView: View {
    @State private var isToggled: Bool = false
    
    var body: some View {
        ChildView(isToggled: $isToggled)
    }
}

struct ChildView: View {
    @Binding var isToggled: Bool
    
    var body: some View {
        Toggle("Toggle", isOn: $isToggled)
    }
}

@ObservedObject

@ObservedObject 속성 래퍼는 외부 객체의 변경을 관찰할 때 사용됩니다. 외부 객체가 업데이트될 때 뷰도 자동으로 업데이트됩니다.

class UserData: ObservableObject {
    @Published var name: String = "John"
}

struct ContentView: View {
    @ObservedObject var userData: UserData
    
    var body: some View {
        Text(userData.name)
    }
}

@EnvironmentObject

@EnvironmentObject 속성 래퍼는 환경 객체를 사용할 때에 사용됩니다. 여러 뷰에서 공유되어야 하는 전역 객체를 사용할 때 유용합니다.

class UserSettings: ObservableObject {
    @Published var themeColor: Color = .blue
}

struct ContentView: View {
    @EnvironmentObject var userSettings: UserSettings
    
    var body: some View {
        Text("Theme color: \(userSettings.themeColor.description)")
    }
}

SwiftUI에서는 위와 같은 속성 래퍼를 통해 뷰의 기억을 효과적으로 제어할 수 있어, 더욱 강력하고 유연한 앱을 구축할 수 있습니다.

참고: