[SwiftUI][Concept] @StateObject - @Published 에 대하여

Uno·2021년 12월 27일
0

SwiftUI

목록 보기
12/30

@StateObject


애플에서의 정의입니다.

Observable object를 인스턴스화 하는 프로퍼티 래퍼 타입을 의미합니다.

ObservableObject

여기서 말하는 “Observable Object” 란,
Observable Object 를 준수하는 객체를 의미합니다. 예를들면 아래 코드처럼요.

class ViewModel: ObservableObejct { ... }

그러면 “Observable Object” 은 무엇일까요?

퍼플리셔 오브젝트 타입인데, 객체가 변하기 전에 방출하는 그런 타입입니다.

직역하면 무슨 말인지 이해가 안되니 좀 의역하자면,

"객체가 변하기 전에, 방출하는 객체 타입”

으로 이해할 수 있겟네요. 즉 “willSet” 의 느낌이라고 보시면 되겠습니다.

코드로 보면 다음과 같습니다.

class ViewModel: ObservableObject {
	@Published var name: String = ""
}

@Published??

@Published 얘는 또 뭔지 조금 알아볼게요.

Published

표시된 프로퍼티를 방출하는 타입?

코드를 먼저 보겠습니다.

class MyBag: ObservableObject {
	var appleDevice = [String]()
}

(비유입니다.) 제 가방에 애플 제품들이 여러개가 있는 상태입니다. 애플 제품들은 비싸죠? 그래서 언제나 관찰하고 관리해야합니다. 그래서 제 가방은 “ObservableObeject”로 채택하고, 언제든 살펴보기로 했습니다.

그런데 이상태에서는 하나의 제품이 빠지더라도, 알 수가 없습니다.

제 가방을 제가 관리해봐야, 안에 내용물의 변화는 알 수 없습니다. 계속 가방의 외관에 문제 생겼는지만 보고 있을 테니까요.
내부에서 발생하는 변화를 알아채려면, 내부에서 알려줘야합니다.

그래서 그걸 위해서 이렇게 코드를 변경합니다.

class MyBag: ObservableObject {
	@Published var appleDevice = [String]()
}

이제 애플제품이 이동하게되면, 변화를 퍼블리쉬드 해줍니다. 즉, 변화가 생기면 그것들을 알리게 된다는 거죠.

이제 본론들아오겠습니다.


다시 본론으로 @StateObject

@StateObjects는 View, App, Scene과 같은 곳에서 생성할 수 있습니다.

이렇게요.

@StateObject var model = DataModel()

“Observable object를 인스턴스화” 라고 위에서 말했었죠.

ObservableObject로 구성한 객체를 인스턴스화 시킬땐, 옆에 “@StateObject” 라고 감싸줘야합니다.
이렇게 선언했으면, 안애 있는 값이 변하면 언제든 뷰를 업데이트합니다. (자동적으로 UI Update를 진행한다는 의미입니다.)

Text(model.title)

정리

  • @StateObject 는 ObservableObject를 채택한 객체를 인스턴스로 만들 때 사용한다.
  • ObservableObject를 구성할 때, @Published 를 추가하여 이벤트 업데이트 시, 알림을 줄 프로티를 결정한다.

참고자료

profile
iOS & Flutter

0개의 댓글