애플에서의 정의입니다.
Observable object를 인스턴스화 하는 프로퍼티 래퍼 타입을 의미합니다.
여기서 말하는 “Observable Object” 란,
Observable Object 를 준수하는 객체를 의미합니다. 예를들면 아래 코드처럼요.
class ViewModel: ObservableObejct { ... }
그러면 “Observable Object” 은 무엇일까요?
퍼플리셔 오브젝트 타입인데, 객체가 변하기 전에 방출하는 그런 타입입니다.
직역하면 무슨 말인지 이해가 안되니 좀 의역하자면,
"객체가 변하기 전에, 방출하는 객체 타입”
으로 이해할 수 있겟네요. 즉 “willSet” 의 느낌이라고 보시면 되겠습니다.
코드로 보면 다음과 같습니다.
class ViewModel: ObservableObject {
@Published var name: String = ""
}
@Published??
@Published 얘는 또 뭔지 조금 알아볼게요.
표시된 프로퍼티를 방출하는 타입?
코드를 먼저 보겠습니다.
class MyBag: ObservableObject {
var appleDevice = [String]()
}
(비유입니다.) 제 가방에 애플 제품들이 여러개가 있는 상태입니다. 애플 제품들은 비싸죠? 그래서 언제나 관찰하고 관리해야합니다. 그래서 제 가방은 “ObservableObeject”로 채택하고, 언제든 살펴보기로 했습니다.
그런데 이상태에서는 하나의 제품이 빠지더라도, 알 수가 없습니다.
제 가방을 제가 관리해봐야, 안에 내용물의 변화는 알 수 없습니다. 계속 가방의 외관에 문제 생겼는지만 보고 있을 테니까요.
내부에서 발생하는 변화를 알아채려면, 내부에서 알려줘야합니다.
그래서 그걸 위해서 이렇게 코드를 변경합니다.
class MyBag: ObservableObject {
@Published var appleDevice = [String]()
}
이제 애플제품이 이동하게되면, 변화를 퍼블리쉬드 해줍니다. 즉, 변화가 생기면 그것들을 알리게 된다는 거죠.
이제 본론들아오겠습니다.
@StateObjects는 View, App, Scene과 같은 곳에서 생성할 수 있습니다.
이렇게요.
@StateObject var model = DataModel()
“Observable object를 인스턴스화” 라고 위에서 말했었죠.
ObservableObject로 구성한 객체를 인스턴스화 시킬땐, 옆에 “@StateObject” 라고 감싸줘야합니다.
이렇게 선언했으면, 안애 있는 값이 변하면 언제든 뷰를 업데이트합니다. (자동적으로 UI Update를 진행한다는 의미입니다.)
Text(model.title)