SwiftUI/SwiftUI 문법

[SwiftUI] @StateObject 알아보기

hyunjuntyler 2023. 5. 20. 15:33

앞에서 @Published, @ObservedObject 를 공부했다. 그것과 바로 이어지는 것이 @StateObject 이다.

 

[SwiftUI] @Published, @ObservedObject 알아보기

시작하기에 앞서... 이 글은 @Published, @ObservedObject 을 아주~ 간단하게 설명한 글이다. 기본적인 것부터 알아두고 심도있게 들어가는것이 맞는 것 같다. (Combine 프레임워크, ViewModel... 등 공부가 필

codingnest.tistory.com

@ObservedObject 의 문제점

@Published 로 선언된 변수가 변경될 때 뷰를 자동으로 업데이트시켜주지만 문제가 있다. 화면 자체가 다시 업데이트된다면 변수는 초기화된다. 이게 무슨 소리인지 헷갈릴 것이다. 아래와 같은 예시를 보면 쉽다. 아래와 같이 Count 클래스를 사용해서 ContentView 를 만들어 줬다.

그렇다면 이 ContentViewMainView 에 사용하고 싶다고 해보자. MainView 에서는 number 를 사용하여 count 와 똑같이 버튼을 누르면 1 이 더해지게 만들었다. 그리고 아래 ContentView 를 넣어주었다. 구분하기 쉽게 하기 위해서 배경을 넣어주었다. 코드를 너무 유심히 보기보다는 Preview 를 유심히 보는것을 추천한다...

ContentViewcount plus 버튼을 누르면 count 가 정상적으로 올라간다.

하지만 여기서 큰 문제가 있다. number plus 버튼을 누르게 되면 number 의 값이 1 이 올라가고 View 가 업데이트 되면서 count0 으로 초기화가 된다. 이유는 @Statenumber 가 업데이트 된다면 뷰를 다시 불러오기 때문이다.

@StateObject 의 사용

count 를 그대로 유지하고 싶을 때 쓰는 것이 @StateObject 이다. 아래와 같이 @ObservedObject 대신에 @StateObject 를 써주면 된다.

그렇게 되면 number 의 값이 변경되더라도 count 도 같이 유지되게 된다.

 

결론

@StateObject@ObservedObject 와 거의 유사하지만, 뷰가 업데이트 될 때 값을 초기화하지 않고, 그대로 유지해 준다.