[SwiftUI] Data Flow — StateObject
3 min readSep 20, 2020
ObservableObject
객체의 값이 바뀌기 전에 퍼블리싱하는 객체 타입.
@Published
속성을 갖는 프로퍼티들의 값이 변하기 전에 objectWillChange
을 통해 퍼블리싱 합니다.
class Contact: ObservableObject {
@Published var name: String
@Published var age: Int init(name: String, age: Int) {
self.name = name
self.age = age
} func haveBirthday() -> Int {
age += 1
return age
}
}let john = Contact(name: "John Appleseed", age: 24)cancellable = john.objectWillChange
.sink { _ in
print("\(john.age) will change") // 1
}print(john.haveBirthday()) // 2// Prints "24 will change"
// Prints "25"
StateObject
ObservableObject
를 인스턴스화 하는 프로퍼티 wrapper 타입
View
, App
, Scene
에서 선언 가능하며 선언할때 ObservableObject
프로토콜을 준수하는 값을 초기값으로 합니다.
@StateObject var model = DataModel()
SwiftUI는 이 객체를 선언한 struct
의 인스턴스 별로 한번씩 state object 에 대해 새 인스턴스를 생성합니다. Observable object에 변화가 있을 때마다 SwiftUI는 이에 의존하고 있는 뷰들을 업데이트 합니다.
Text(model.title) // `title` 값이 변할 때마다 뷰 업데이트
State object는 ObservedObject
속성을 갖는 프로퍼티에 객체를 전달 할 수 있습니다. 또한 environmentObject(_:)
modifier를 사용해서 뷰 계층의 environment에 추가할 수 있습니다.
ContentView()
.environmentObject(model)
아래와 같이 environment 객체를 생성하면, EnvironmentObject 속성을 사용하는 ContentView 나 속한 뷰들 안의 객체들을 읽을 수 있습니다.
@EnvironmentObject var model: DataModel
바인딩 할때는 $
오퍼레이터를 사용합니다.