iOS 응용 (SwiftUI)
[iOS - SwiftUI] ObservableObject, @Published, obejctWillChanged, @ObservedObject, @State 개념 정리
jake-kim
2024. 8. 16. 01:32
ObservableObjec, @Published, objectWillChanged 개념
- ObservableObject는 옵저빙 될 수 있는 모델을 의미
- 옵저빙 된다는 의미는 값이 변경되었을때, 이 모델을 옵저빙하고 있는 대상에게 알림을 주는 것
- 변경된다는 기준은 @Publihsed 키워드로 선언된 프로퍼티가 변경되었을때 알림을 줌
- @Published를 사용하면 objectWillChanged라는 내부 프로퍼티에 send()를 날리는 것과 동일
class User: ObservableObject {
let name = "name"
/// @Published: 변경되었다는 기준이 될 property에 선언
@Published var score = 0
/* objectWillChanged에 send()하면 변경되었다고 알려주는 것인데, @Published를 사용하면 아래 코드가 자동으로 처리되는 것
let objectWillChanged = ObejctWilLChangePublisher()
var score = 0 {
willSet { objectWillChanged.send() }
}
*/
}
@ObservedObject와 @State 차이
- @ObservedObject는 ObservableObject를 준수한 모델을 옵저빙 할 때 쓰는 키워드
struct ContentView: View {
/// @ObservedObject: 뷰에서 OservableObject 모델을 사용하려면 @ObservedObject키워드 선언이 필요
@ObservedObject var user: User
var body: some View {
VStack {
Text(user.name)
Button(action: { self.user.score += 1 }) {
Text(user.score.description)
}
}
.padding()
}
}
- @State는 뷰 내부에서만 옵저빙하는 상태값을 사용할 때만 사용
ex) @State 예제
struct ContentView: View {
@State private var count = 0
var body: some View {
VStack {
Text("Button clicked \(count) times")
.font(.largeTitle)
.padding()
Button(action: {
count += 1
}) {
Text("Click me!")
.font(.title)
.padding()
.background(Color.blue)
.foregroundColor(.white)
.cornerRadius(10)
}
}
}
}
- 뷰 내부에서만 사용해야 안전하므로, 애플 문서에서도 private 사용을 권장함
* 참고