본문 바로가기

IOS

SwiftUI Apprentice chapter 11 managing data with property wrappers 리뷰

@State, @Binding, @Environment, @StateObject, @EnvironmentObject에 대한 리뷰.

 


value 타입, 구조체

 

@State : Source of truth // 

 

@Binding : values come from a parent view // 부모 뷰로부터 전달 받은 value (read, write 모두 가능)

- read-only로 전달할 경우, 바인딩 없이 전달 가능

@Environment : environment value persists within the subtree of the view

 

그림으로 표현했을 때 다음과 같이 생각됨.


 

reference 타입, 클래스

 

@StateObject - @ObservedObject의 관계는 구조체의 @State와 @Binding과 같은 방식

@StateObject의 경우, initialize가 한번만 이루어진다. 뷰가 다시 그려지더라도 초기화가 또 이뤄지진 않음.

 

@EnvironmentObject는 view의 서브 트리 내에서는 데이터 접근이 가능해진다. more flexible access

wwdc2020에 도식화된 상태로 설명이 정말 잘 되어 있는데, 뷰 트리의 일부에서만 특정 데이터에 접근하고자 할 때,

인스턴스를 생성해 전달하지 않고, 프로퍼티 래퍼를 통해 접근이 가능하다.

wwdc20 : Data Essentials in SwiftUI
wwdc20 : Data Essentials in SwiftUI

 

 

https://developer.apple.com/videos/play/wwdc2020/10040/

 

@StateObject나 @EnvironmentObject wrapper을 사용하기 위해서는 ObservableObject 프로토콜을 채택한 클래스에서만 가능함

+ 클래스 객체를 @State 프로퍼티 래퍼를 사용해 선언한 경우, value가 메모리 주소에 해당하게 된다.

따라서 값이 변할 때가 아닌 메모리 주소가 변경됐을 때만 뷰가 다시 그려지게 된다.