Notice
Recent Posts
Recent Comments
Link
«   2025/04   »
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 29 30
Archives
Today
Total
관리 메뉴

J

[SwiftUI] @State와 @Binding의 projectedValue ($) 본문

SwiftUI

[SwiftUI] @State와 @Binding의 projectedValue ($)

yujaehui 2024. 4. 29. 15:17

1. projectedValue란?

projectedValue는 @propertyWrapper에서 정의할 수 있는 선택적 프로퍼티.

이는 원래의 wrappedValue와는 다른 추가적인 정보를 제공하거나 특정 작업을 수행할 수 있도록 함.

  • wrappedValue: 주로 데이터를 읽고 쓰는 데 사용.
  • projectedValue: 추가적인 동작이나 값을 제공하기 위해 정의.

SwiftUI에서의 주요 사례는 @State의 Binding 제공.


2. SwiftUI에서 @State와 projectedValue

@State의 동작

@State는 뷰의 상태를 관리하는 SwiftUI의 프로퍼티 래퍼.

@State 프로퍼티는 상태를 직접 수정할 수 있지만, 하위 뷰에 상태를 전달할 때는 Binding 객체로 전달해야 함.

struct ParentView: View {
    @State private var counter = 0

    var body: some View {
        ChildView(counter: $counter) // $counter는 Binding<Int>
    }
}

struct ChildView: View {
    @Binding var counter: Int

    var body: some View {
        Button("Increment") {
            counter += 1 // 상위 뷰의 상태를 수정
        }
    }
}
  • @State는 상태를 관리하고, 해당 상태를 Binding 객체로 노출하기 위해 projectedValue를 사용.
  • $counter는 @State의 projectedValue로, Binding<Int> 타입의 객체를 반환.

projectedValue의 실제 역할

@State의 projectedValue를 통해 반환되는 Binding은 다음과 같은 역할을 함.

  • 상태를 하위 뷰에 공유
    • @Binding은 Binding 객체를 받아 상위 뷰의 상태를 읽고 수정.
  • 양방향 데이터 흐름
    • Binding을 통해 하위 뷰에서 상위 뷰의 상태를 수정.
  • 동기화된 UI 업데이트
    • Binding을 통해 상태가 변경되면, SwiftUI는 UI를 자동으로 업데이트.

3. @State와 Binding의 관계

코드 예제

struct ExampleView: View {
    @State private var isOn = false

    var body: some View {
        Toggle("Switch", isOn: $isOn) // $isOn: Binding<Bool>
    }
}

동작 과정

  1. @State 선언
    • isOn 상태 값은 @State로 선언되어 SwiftUI가 관리.
  2. projectedValue로 Binding 생성
    • $isOn은 projectedValue를 통해 Binding<Bool> 객체를 반환.
  3. Binding 전달
    • Toggle은 Binding을 받아 상태를 읽고 수정.
  4. 상태 변경과 UI 업데이트
    • 사용자가 Toggle을 변경하면, Binding이 isOn 값을 업데이트하고 SwiftUI는 UI를 다시 렌더링.

Binding의 내부 동작

Binding은 상태 값에 대한 읽기와 쓰기를 캡슐화.

struct Binding<Value> {
    var wrappedValue: Value { get nonmutating set } // 상태 읽기/쓰기
    var projectedValue: Binding<Value> { self } // 자체 반환
}
  • wrappedValue
    • 상태 값을 읽거나 수정.
    • 예: counter += 1은 wrappedValue를 사용해 값을 수정.
  • projectedValue
    • Binding 객체를 반환해 하위 뷰에서 사용.

4. SwiftUI의 렌더링 시점과 projectedValue

SwiftUI에서 @State의 상태 변경은 렌더링 사이클과 밀접하게 연결되어 있음.

렌더링 시점에서의 동작

  1. 초기 렌더링
    • @State의 상태를 초기화
  2. 상태 변경
    • projectedValue를 통해 Binding 객체가 전달되고 상태 변경을 감지.
  3. UI 업데이트
    • 상태 변경이 감지되면, SwiftUI가 UI를 다시 렌더링.

5. 요약: projectedValue의 핵심 역할

속성 설명
wrappedValue 프로퍼티 래퍼가 관리하는 기본 값에 접근.
projectedValue 프로퍼티 래퍼가 추가적으로 노출하는 객체(Binding, Environment, 등).
@State 예시 projectedValue를 통해 Binding을 생성하여 하위 뷰와 상태를 공유.
SwiftUI에서 중요성 projectedValue는 상태 공유 및 UI 업데이트를 위한 양방향 데이터 바인딩의 핵심.

 

결론적으로, SwiftUI의 @State와 @Binding은 projectedValue를 활용하여 상태 관리와 데이터 바인딩을 구현.

'SwiftUI' 카테고리의 다른 글

[SwiftUI] NavigationView vs NavigationStack  (0) 2024.05.09
[SwiftUI] SwiftUI의 View Rendering  (0) 2024.05.08
[SwiftUI] ViewModifier, modifier(_:)  (0) 2024.05.03
[SwiftUI] Source of Truth  (0) 2024.04.29
[SwiftUI] @State, @Binding  (0) 2024.04.29