@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: AnyObject
Object가 변경되기 전에 방출(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(_:)
를 호출하여 상위 뷰에서 값을 제공