@State는 SwiftUI에서 제공하는 읽기/쓰기가 가능한 Property Wrapper 타입입니다.
@State 속성으로 선언된 프로퍼티의 값이 변경되면, 해당 프로퍼티 값에 의존하는 뷰 계층 구조의 일부를 업데이트합니다.
struct PlayButton: View {
@State private var isPlaying: Bool = false
var body: some View {
Button(action: {
isPlaying.toggle()
}, label: {
Image(systemName: isPlaying ? "pause.fill" : "play.fill")
.resizable()
.frame(width: 30, height: 30)
})
}
}
@State 속성으로 선언된 isPlaying 의 값이 변경될 때마다 버튼의 이미지가 변경됩니다.
@State 속성으로 선언된 프로퍼티는 초깃값을 가져야하고, 생성자를 통해 값이 초기화되지 않도록 private로 선언하는 것을 권장합니다.
하위뷰에서 상위뷰의 상태값을 변경시키고 싶을 때, 상위뷰에서 하위뷰로 상태값에 대한 바인딩을 전달하여 목적을 달성할 수 있습니다.
// subView
struct PlayButton: View {
@Binding var isPlaying: Bool
var body: some View {
Button(action: {
isPlaying.toggle()
}, label: {
Image(systemName: isPlaying ? "pause.fill" : "play.fill")
.resizable()
.frame(width: 30, height: 30)
})
}
}
하위뷰에서는 상위뷰로부터 바인딩을 전달받기 위해 프로퍼티를 @Binding 속성으로 선언합니다.
// parent view
struct ContentView: View {
@State private var isPlaying: Bool = false
var body: some View {
PlayButton(isPlaying: $isPlaying)
}
}
상태값에 대한 바인딩을 얻기 위해서 프로퍼티의 이름 앞에 달러 기호($)를 붙이면 됩니다.
이 바인딩을 하위뷰 생성자를 통해 전달합니다.