본문 바로가기

프로그래밍/SWIFT

SwiftUI] StateObject, Published, ObservableObject

반응형

https://www.hackingwithswift.com/books/ios-swiftui/sharing-swiftui-state-with-stateobject

swiftui 에서 struct 인스턴스 변수는 간단한 @State 로 (내부 프로퍼티의) 변경을 감지하여 UI에 반영할 수 있다.

하지만 class 인스턴스 변수는 @State 를 붙여도 내부 프로퍼티의 변경을 감지하지 못한다. class 의 내부 프로퍼티의 변경을 감지하도록 하는 방법은 다음과 같다.

1. 외부에서 변경을 감지하려는 클래스의 프로퍼티에 @Published 를 붙여준다.

class User {
  @Published var name: String = "Micky"
  @Published var age: Int = 10
}

2. view 의 클래스 인스턴스 선언에 @State 가 아닌 @StateObject 를 붙여준다.

  @StateObject var user = User()
 
  // view body ...

3. @StateObject 는 ObservableObject 프로토콜을 따르는 클래스여야 한다. 클래스가 ObservableObject 프로토콜을 상속하게 한다.

class User: ObservableObject {
  @Published var name: String = "Micky"
  @Published var age: Int = 10
}

 

@StateObject 와 비슷한 @ObservedObject 도 있다. 이건 다른 view 에 있는 인스턴스의 변화를 모니터하고 싶을 때 사용한다.

728x90