1. @상태, @바인딩
@State는 뷰 자체가 가져야 하는 상태 속성으로 소스 데이터입니다.
특정 데이터의 지속 상태를 저장하고 관찰하는 역할을 합니다.
-> 이 데이터는 변경될 수 있고 보기에 종속되므로 보기도 변경됩니다.
다음과 같이 해석됨
@Binding은 하위 뷰가 상위 뷰의 상태를 사용하고 변경할 수 있도록 하는 파생물입니다.
다음 예를 살펴보겠습니다.
struct ContentView: View {
@State private var isFavorite = true
@State private var count = 0
var body: some View {
VStack(spacing: 30) {
Toggle(isOn: $isFavorite) {
Text("\(isFavprote)")
}
Stepper("\(count)", value: $count)
}
}
}
– @State는 뷰 자체의 UI 상태를 저장하는 데이터입니다.
view가 소유하고 관리한다는 개념으로 private을 사용하는 것이 좋습니다.
– 변수 앞에 ($status 속성명)을 쓰면 내부적으로 projectedValue라는 속성이 사용되는데, 이 타입은 @Binding 타입이므로 Binding 타입의 파라미터에 status 속성 값을 넘겨줄 수 있다.
– 같은 뷰 내에서 값을 읽고 쓸 때 $ 없이 일반 변수처럼 사용 가능
2. 관찰 가능한 객체, @ObservedObject
ObservableObject는 뷰 외부에서 모델의 소스 데이터를 처리하기 위해 값 유형 대신 참조 유형을 사용할 때 사용됩니다.
protocol ObservableObject: AnyObject {}
ObservableObject는 Anyobject를 프로토콜로 사용하므로 클래스 유형만 사용할 수 있습니다.
예를 보자
class User: ObservableObject {
let name = "user name"
var score = 0
}
struct ContentView: View {
@ObservedObject var you: User
var body: some View {
VStack(spacing: 20) {
Text(you.name)
}
Button(action: {self.you.score += 1}) {
Text(you.score)
}
}
}
ContentView(you: User())