[SwiftUI] @State에 대하여

Uno·2021년 8월 11일
1

SwiftUI

목록 보기
7/30

모야 : 제가 SwiftUI를 처음 공부하는데요, 막 앞에 @이런게 붙어서 @State, @Binding 그리고 @Environment 이 있어요. 이게 뭔가요? UIKit 공부할 땐, 이런거 본적이 없는데... ㅠㅠ

우노 : 네 SwiftUI를 사용하게 되면, 숨쉬듯이 사용하게 될 개념인데요. 이번엔 @State에 대한 개념을 먼저 잡아볼게요.

@State


공식문서링크입니다.

https://developer.apple.com/documentation/swiftui/state

공식문서에 적힌 글을 먼저 볼까요?

A property wrapper type that can read and write a value managed by SwiftUI.

해석해보면, "SwiftUI에서 관리하는 값을 읽고 쓸 수 있는 속성 래퍼 유형입니다." 정도로 해석할 수 있겠습니다.

여기서 래퍼는 참고로 ShowMeTheMoney의 래퍼가 아닙니다.

여기서 래퍼는 "감싸다" 뜻의 랲 입니다.

"값을 관리할 수 있도록 감싸둔 유형이다" 정도로 의역할 수 있겠네요.

SwiftUI manages the storage of any property you declare as a state. When the state value changes, the view invalidates its appearance and recomputes the body. Use the state as the single source of truth for a given view.

SwiftUI는 선언한 프로퍼티들의 저장소를 관리합니다.

그 "state" 변경된다면, view의 구성된 외형은 폐기하고 다시 계산하여 구성합니다.

"state"는 view에 하나의 원천 소스로 사용해라!

해석해보면, 뭔가 감은 오는데, 설명은 못하겠는 느낌입니다.

추가로 뒤에 적힌 설명을 정리하면, 다음과 같습니다.

  • state는 값을 변경하도록 도와주는 수단입니다. 무언가 value라는 개념으로 이해하지 말라는 뜻 같습니다.
  • state 가 선언된 struct가 있겠죠. 그 내부에 있는 view(body겠죠.)에서만 state 에 접근하도록 하라고 합니다. 즉 접근제한자 private 하도록 사용하라고 합니다.

공식문서 설명을 듣고 드는 생각은

음... UIKit에서 여태 사용했던 didSet 같은데?

모야 : 맞아요. didSet도 값을 관찰하고 있다가, 값이 변경되면 해당 코드블럭이 실행되죠! 다만 차이가 있다면, didSet은 내부 코드블럭만 실행된다면, state는 view를 다시 아예 만들어버린다는 차이가 있는 것 같습니다.

우노 : 그러면 didSet을 활용하면 되는거 아닌가요? 왜 @State를 사용했을까요?

모야 : ... ? 감도 안잡히는데요?

우노 :

두 개의 차이점에서부터 생각해보면, 이해가 되실겁니다.

SwiftUI에서 View는 struct 이죠.

struct 에서 메소드를 만든 후, 내부의 프로퍼티를 변경하려고하면 "mutating" 임을 선언해야합니다.

우리가 사용했던 didSet은 class 내부에서 사용했다는 점과, @State 는 struct 에서 사용된다는 점이 다릅니다.

그러다보니, struct에서 값이 변경가능하고 이 값이 변경될때마다 로직을(아마 view를 그리는 활동) 변경하고 싶으니,

새로운 @State라는 개념을 도입한거죠.

생성하고나면, 해당 값을 관찰하고 + 값이 변경이 가능하도록 말이죠.

모야 : 오케이, 그러면 struct에서 didSet 역할을 유사하게 한다. 라고 받아들이면, 일단 마음은 편해지네요. 그런데, 위에서 보면 private 하게 사용하라는건 뭔말인가요?

우노 : 네, 이건 추후에 나올 @Binding, @ObservableObject, @EnvironmentObject 개념들과 함께 설명하면 좋을 것 같습니다.

일단 이렇게만 이해해두세요.

@State는 자기가 속한 View에서만 한정되는 값이다.
만약, 공유하거나 다른 view에서 접근하도록 하고 싶다면, @ObservableObject 와 @EnvironmentObject를 사용한다.

다음 글에서 이어서 작성하겠습니다!

참고자료


profile
iOS & Flutter

0개의 댓글