상태 프로퍼티는 상태에 대한 가장 기본적인 형태이며, 뷰 레이아웃의 현재 상태에 저장하기 위해서 사용된다.
또한 상태 값은 해당 뷰에 속한 것이기 때문에 private로 선언되어야 한다. 상태 프로퍼티 값이 변경되었다는 것은 그 프로퍼티가 선언된 뷰 계층구조를 다시 렌더링 해야 한다는 뜻이다.
공식문서
애플은 state 프로퍼티를 일시적으로 유저의 인터페이스에 영향을 미치는 상태를 관리할때만 사용을 하라고 권장을하고 있다.
또한 상속된 곳에서 State를 사용하는 것을 권장하지 않는다고 한다. 만약 상속된곳에서 초기화를 해버리면 SwiftUI에서 제공하는 storage management에서 conflic가 일어난다고 한다.
struct PlayerView: View {
@State private var isPlaying: Bool = false
var body: some View {
// ...
}
}
Button(action: {
self.isPlaying.toggle()
}) {
Image(systemName: isPlaying ? "pause.circle" : "play.circle")
}
@Binding은 SwiftUi에서 데이터의 양방향 바인딩을 구현하기 위해 사용되는 속성 래퍼이다. @Binding은 뷰 간에 데이터를 공유하고 업데이트 하는데 사용된다.
참조: @Binding 속성은 값 자체를 저장하는 것이 아니라, 값의 참조를 저장한다. 따라서 부모 뷰와 자식 뷰가 같은 데이터 값을 참조 하게 된다. -> 값이 변경되면 참조를 통해 모든 연결된 뷰에서 변경 내용이 반영된다.
양뱡향 데이터 흐름: @Binding 속성은 값을 읽기만 하는 것이 아니라, 값을 수정할 수도 있다. 자식 뷰에서 값을 변경하면, 해당 변경 사항이 부모 뷰로 전파되어 다른 연결된 뷰에도 영향을 미친다.
데이터의 싱크: @Binding 속성은 데이터의 싱크를 자동으로 관리한다. 부모 뷰에서 값을 업데이트하면 자식 뷰의 @Binding 속성도 함께 업데이트되어 동일한 값을 유지한다. 반대의 경우도 마찬가지이다.
데이터 공유: @Binding속성은 데이터를 여러 뷰 간에 공유할 수 있도록 해준다. 한 @Binding속성을 여러뷰에서 사용하면 해당 데이터에 대한 변경 사항은 모든 연결된 뷰에 동시에 반영된다.
struct ContentView: View {
@State private var book: Book?
var body: some View {
DeleteBookView(book: $book)
.task {
book = Book()
}
}
}
struct DeleteBookView: View {
@Binding var book: Book?
var body: some View {
Button("Delete book") {
book = nil
}
}
}![](https://velog.velcdn.com/images/hong2/post/f5cd7258-49f0-44e4-be3e-5091d2c9dddc/image.png)