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 사용을 권장함

https://developer.apple.com/documentation/swiftui/state

* 참고

- https://developer.apple.com/documentation/swiftui/state