@frozen @propertyWrapper struct State<Value>
SwiftUI에서 값을 읽고 쓸 수 있는 Property Wrapper
@State로 선언한 속성을 관리@State 인스턴스는 값이 아니라, 값을 읽고 쓰는 수단wrappedValue 속성값이 반환struct PlayButton: View {
    @State private var isPlaying: Bool = false
    
    var body: some View {
        Button(isPlaying ? "Pause" : "Play") {
            isPlaying.toggle()
        }
    }
}
isPlaying 값에 따라 달라지고, 동작은 isPlaying을 변경State의 wrappedValue에 의존State를 하위 뷰에 전달하면, 상위 뷰에서 변경된 State로 하위 뷰를 업데이트하지만 하위 뷰는 값을 수정 불가@Binding을 전달State를 초기화하면State를 항상 private로 선언State를 접근해야 하는 계층 중 가장 상위 뷰에 배치@frozen @propertyWrapper @dynamicMemberLookup struct Binding<Value>
SSOT가 가진 값을 읽고 쓸 수 있는 Property Wrapper
@Binding을 사용하여, 데이터를 갖는 프로퍼티와 데이터를 표시 및 변경하는 뷰를 연결struct PlayButton: View {
    @Binding var isPlaying: Bool
    var body: some View {
        Button(isPlaying ? "Pause" : "Play") {
            isPlaying.toggle()
        }
    }
}
struct PlayerView: View {
    var episode: Episode
    @State private var isPlaying: Bool = false
    var body: some View {
        VStack {
            Text(episode.title)
                .foregroundStyle(isPlaying ? .primary : .secondary)
            PlayButton(isPlaying: $isPlaying)
        }
    }
}
상위 뷰인 PlayerView에서는 SSOT인 isPlaying 값을 @State로 선언
하위 뷰인 PlayButton에서는 SSOT를 바인딩하기 위해 @Binding으로 선언
PlayButton 호출 시 $가 붙는 이유는@frozen @propertyWrapper struct Environment<Value>
뷰의 environment를 읽는 Property Wrapper
wrappedValue에서 값을 읽고, 뷰의 내용을 조정@Environment(\.colorScheme) var colorScheme: ColorScheme
if colorScheme == .dark { ... }
else { ... }
environment(_:_:) view modifier로 재정의 가능@frozen @propertyWrapper struct StateObject<ObjectType>
    where ObjectType : ObservableObject
Observable Object를 인스턴스화하는 Property Wrapper
ObservableObject (Combine)
protocol ObservableObject: AnyObjectObject가 변경되기 전에 방출(emit)하는 Publisher이 있는 타입
ObservableObject는@Published의 속성이 변경되기 전에 이를 방출하는objectWillChange를 합성
@StateObject를 사용하여 View, App, Scene에 state object를 만듦ObservableObject의 @Published가 변경되면, SwiftUI는 해당 속성을 사용한 뷰를 자동으로 업데이트@propertyWrapper @frozen struct ObservedObject<ObjectType> 
    where ObjectType : ObservableObject
Observable Object를 구독하고, 변경될 때마다 뷰를 무효화하는 PropertyWrapper
@frozen @propertyWrapper struct EnvironmentObject<ObjectType> 
    where ObjectType : ObservableObject
상위 뷰(parent or ancestor)에서 제공하는 Observable Object를 선언하기 위한 Property Wrapper
@ObservedObject와 마찬가지로 Observable Object가 변경될 때마다 뷰를 무효화environmentObject(_:)를 호출하여 상위 뷰에서 값을 제공