Notice
Recent Posts
Recent Comments
Link
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
Archives
Today
Total
관리 메뉴

Jupyo's Daily Story

@State 본문

SwiftUI

@State

JangJupyo 2020. 10. 15. 15:14
728x90
반응형

@State는 SwiftUI에서 상태 관리를 위해 사용하는 프로퍼티 래퍼입니다. SwiftUI는 선언적 UI 프레임워크로, UI를 상태 기반으로 구성합니다. @State는 이 상태를 관리하는 데 중요한 역할을 합니다. 자세히 살펴보면:

기본 개념

  • 상태(State): 앱의 UI와 상호작용을 통해 변할 수 있는 데이터입니다. @State를 사용하면 이 데이터를 관리하고, 데이터가 변경될 때 UI가 자동으로 업데이트됩니다.

  • 프로퍼티 래퍼(Property Wrapper): @State는 프로퍼티 래퍼로, 변수에 상태 관리를 부여합니다. 이 래퍼는 SwiftUI가 해당 변수를 감시하고, 값이 변경될 때 UI를 다시 렌더링하도록 돕습니다.

사용 방법

  1. 선언: @Statestruct 내부에서 선언됩니다. 일반적으로 View 구조체의 프로퍼티로 사용됩니다.

     struct ContentView: View {
         @State private var count = 0
    
         var body: some View {
             VStack {
                 Text("Count: \(count)")
                 Button(action: {
                     count += 1
                 }) {
                     Text("Increment")
                 }
             }
         }
     }
  2. 자동 업데이트: @State로 선언된 변수의 값이 변경되면, SwiftUI는 자동으로 해당 뷰를 재렌더링합니다. 위의 예에서 버튼을 누르면 count 값이 증가하고, Text 뷰가 업데이트됩니다.

  3. 제한사항:

    • @StateView 내부에서만 사용할 수 있습니다. 다른 뷰에 전달하려면 @Binding 또는 ObservableObject를 사용해야 합니다.
    • @State로 선언된 변수는 구조체가 소유하며, 다른 뷰에서 직접 접근할 수 없습니다.

@Binding과의 차이점

  • @Binding은 부모 뷰에서 상태를 자식 뷰에 전달할 때 사용됩니다. @Binding은 상태를 공유할 수 있게 하여, 자식 뷰에서 상태를 변경하면 부모 뷰의 상태도 업데이트됩니다.

      struct ParentView: View {
          @State private var isToggled = false
    
          var body: some View {
              ToggleView(isToggled: $isToggled)
          }
      }
    
      struct ToggleView: View {
          @Binding var isToggled: Bool
    
          var body: some View {
              Toggle(isOn: $isToggled) {
                  Text("Toggle me!")
              }
          }
      }

결론

@State는 SwiftUI의 상태 관리에서 핵심적인 역할을 합니다. 상태 변화에 따라 UI를 자동으로 업데이트할 수 있게 해주며, 선언적인 UI 프로그래밍 모델과 잘 어울립니다. @State를 활용하여 상태 기반의 반응형 UI를 쉽게 구현할 수 있습니다.

반응형

'SwiftUI' 카테고리의 다른 글

@StateObject  (0) 2020.10.15
ObservableObject  (0) 2020.10.15
@EnvironmentObject  (0) 2020.10.14
Spacing & Spacer  (0) 2020.10.13
ForEach  (0) 2020.10.13