대표적인 Property

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())