[SwiftUI] Data Flow — StateObject

J_sung_0o0
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

바인딩 할때는 $ 오퍼레이터를 사용합니다.

참고

--

--

J_sung_0o0
J_sung_0o0

Written by J_sung_0o0

Apple WWDC 19 & 20 Winner (The 1st two-time winner of all time from South Korea)

No responses yet