private
로 선언하는 것이 좋음.State
값을 하위 뷰에 전달하여 상위와 하위 뷰가 같은 값을 공유하고, 데이터 변경 시 자동으로 업데이트됨.State
를 Binding
으로 넘길 때는 $
표시를 사용해야 함.State
는 단일 뷰 내에서만 관리되어야 하며, 외부에 전달하지 않도록 주의.Binding
은 상위 뷰와 하위 뷰 간의 데이터 공유와 상태 관리를 위해 사용됨.State는 SwiftUI가 관리하는 값을 읽고 쓸 수 있는 속성 래퍼 유형으로, 뷰 내에서만 사용이 가능합니다.
SwiftUI의 State
는 뷰의 상태를 관리하고, 상태가 변경될 때 뷰를 자동으로 재랜더링하여 최신 상태를 반영합니다.
정의는 다음과 같습니다.
@frozen @propertyWrapper
struct State<Value>
State의 초기화는 뷰 내부에서 해야 하며, 다른 객체로부터 State 값을 받는 것은 권장하지 않습니다. 이는 State 값이 외부에서 전달받더라도 유지되지 않기 때문입니다.
이러한 이유로 외부에서 해당 State 값을 수정하는 것을 막기 위해 private
로 선언하기를 권장합니다.
State는 값이 변경되면 해당 뷰를 부분적으로 업데이트하여 변경된 값을 반영합니다.
변화가 없는 부분들은 업데이트 되지 않기 때문에 최소 렌더링을 통해 성능이 향상됩니다.
아래는 공식 문서에 작성되어 있는 예제 코드입니다.
struct PlayButton: View {
@State private var isPlaying: Bool = false // Create the state.
var body: some View {
Button(isPlaying ? "Pause" : "Play") { // Read the state.
isPlaying.toggle() // Write the state.
}
}
}
PlayButton 뷰가 사용자에 의해 값이 변경되면 State property로 선언된 isPlaying
의 값이 변경됩니다. 따라서 isPlaying
은 항상 최신 값을 유지할 수 있습니다.
화면을 구성하다 보면 상위 뷰와 하위 뷰의 State 프로퍼티가 연결되어야 하는 경우가 많습니다. 공식 문서를 보면 State로 선언된 isPlaying
의 값을 하위 뷰와 공유하기 위해서는 Binding
을 사용하면 된다고 합니다.
그럼 이번에는 Binding에 대해 알아보도록 하겠습니다.
Binding은 다른 뷰로부터 프로퍼티들을 받을 때 사용합니다. Binding은 읽기만 가능한 것이 아닌 쓰기도 가능하기 때문에 값을 수정할 수 있습니다. 다만, 상위 뷰와 연결되어 있기 때문에 프로퍼티를 제공한 상위 뷰의 State 프로퍼티의 값도 같이 변경됩니다.
State를 Binding으로 넘길 때는 앞에 $
표시를 붙여 줘야 합니다. $
표시는 프로퍼티 래퍼 자체를 받는다는 의미이기 때문에 이를 붙이지 않으면 wrapper 값 자체를 바꿀 수 없습니다.
아래는 공식 문서에 작성된 예제입니다.
struct PlayerView: View {
@State private var isPlaying: Bool = false // Create the state here now.
var body: some View {
VStack {
PlayButton(isPlaying: $isPlaying) // Pass a binding.
// ...
}
}
}
struct PlayButton: View {
@Binding var isPlaying: Bool // Play button now receives a binding.
var body: some View {
Button(isPlaying ? "Pause" : "Play") {
isPlaying.toggle()
}
}
}
State에서 봤던 예제와 유사하지만 다른 점은 isPlaying
프로퍼티가 상위 뷰인 PlayerView
에 선언되었고, 이를 Binding을 통해 하위 뷰인 PlayButton
뷰가 받는 점입니다. 이를 통해 사용자에 의해 뷰가 변경되어도 상위 뷰와 하위 뷰가 동시에 같은 값을 반영할 수 있게 됩니다.
private
로 선언하는 것이 좋습니다. 이는 뷰의 일관성을 유지하는 데 도움이 됩니다.오늘은 State와 Binding에 대해 공부한 내용들을 정리해 봤습니다.
State와 Binding의 개념과 사용법은 복잡하지는 않지만 SwiftUI를 사용하는데 있어 기초가 되기에 꼭 알아둬야할 개념인거 같아요.
아직은 그냥 그렇구나. 이렇게 사용하면 되는구나 정도의 단계이지만 차차 사용해 나가면서 더 이해되는 내용이 있다면 추가해 보도록 하겠습니다🙂
출처
https://developer.apple.com/documentation/swiftui/state
https://medium.com/delightroom/swiftui를-맛깔나게-소화하는-킥-property-wrapper-656cf67173d8