[SwiftUI] State & Binding

RudinP·2025년 8월 11일
0

Study

목록 보기
335/352

One-way Binding

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 추가 시 메모리가 저장되는 공간이 구조체와 분리됨
  • private 키워드를 추가하는 것이 좋다.(다른 뷰에서 접근할 일 X)

가령, Text라는 뷰는 표시만 하지 사용자와 상호작용하여 값을 직접 수정할 순 없다.
이런 속성을 One-way Binding이라고 한다.

Two-way Binding

  • TextField와 같이 입력과 출력을 동시에 할 수 있도록 속성과 뷰가 양방향 연결될 때 필요한 변수는 Two-way Binding이 된다.

@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)
        }
    }
}
profile
iOS 개발자가 되기 위한 스터디룸...

0개의 댓글