struct OneWayBinding: View {
@State var text: String = "Hello, SwiftUI"
var body: some View {
VStack(spacing: 70) {
//one-way binding
//텍스트가 직접 본인의 속성을 바꿀 수는 없다.
Text(text)
.font(.largeTitle)
Button {
//뷰는 구조체여서 속성값 못바꿈(값형식)
//body는 computed property
text = "Hi, SwiftUI"
} label: {
Text("Update")
}
.padding()
}
}
}
@State
추가 시 메모리가 저장되는 공간이 구조체와 분리됨가령, Text라는 뷰는 표시만 하지 사용자와 상호작용하여 값을 직접 수정할 순 없다.
이런 속성을 One-way Binding
이라고 한다.
TextField
와 같이 입력과 출력을 동시에 할 수 있도록 속성과 뷰가 양방향 연결될 때 필요한 변수는 Two-way Binding
이 된다.@State
와 다르게 다른 뷰에서 속성에 접근하여 값을 바꿔야 할 때 사용된다.private
키워드는 사용할 수 없다.struct InputView: View {
//다른 뷰의 var과 Binding 하려면 Binding으로 선언
//다른 뷰와 상호작용하므로 private 불가
//기본값 불가
//다른 뷰에서 해당 뷰를 init할때 값 전달
//소유권X
@Binding var value: String
var body: some View {
VStack {
TextField("Value", text: $value)
}
}
}
struct InputView_Previews: PreviewProvider {
static var previews: some View {
//프리뷰에서는 정확한 바인딩이 필요하지 않으므로 상수처리해주면 된다.
InputView(value: .constant("hello"))
}
}
struct TwoWayBinding: View {
@State private var value: String = "Hello"
var body: some View {
VStack(spacing: 70) {
Text(value)
.font(.largeTitle)
//파라미터로 바인딩을 전달하려면 State 특성이 있어야 함.
//Text와 다르게 TextField는 사용자의 입력에 따라 값이 수정됨.
//속성과 뷰가 양방향으로 연결
InputView(value: $value)
}
}
}