miniworld

[SwiftUI] Property Wrapper 본문

SwiftUI/SwiftUI

[SwiftUI] Property Wrapper

Dev_miniworld 2024. 1. 4. 22:11

SwiftUI에서 Property Wrappers는 특별한 기능을 갖는 속성을 정의하는 데 사용된다. Property Wrappers를 사용하면 코드를 간결하고 읽기 쉽게 만들 수 있다.

 

Property Wrappers는 속성에 적용되는 wrapper로, 속성의 값에 추가적인 로직을 적용하거나, 값이 변경될 때 다른 동작을 수행할 수 있도록 해준다. 

 

SwiftUI에서 가장 많이 사용되는 Property Wrappers는 @State, @Binding, @Published, @ObservedObject, @StateObject, @Environment, @EnvironmentObject 이다.

 

@State

  • SwiftUI에서 상태를 저장하는 데 사용되며, 값을 변경할 때마다 뷰가 다시 렌더링된다.
  • 기본적으로 Private 선언이기에 다른 뷰와 값을 소통하려면 Binding을 이용
  • 값이 변경될 때마다 UI 업데이트

 

@Binding

  • 뷰와 상태를 바인딩 하는 방법
  • 상위 @State 변수를 전달 받아 하위 뷰에서 캐치해 변화 감지 및 연결
  • Binding은 다른 뷰가 소유한 속성을 연결하기에 소유권 및 저장 공간이 없음

ObservableObject

  • 클래스 프로토콜로 관찰하는 어떠한 값이 변경되면 변경사항을 알려줌
  • 뷰에서 인스턴스 변화를 감시하기 위해 뷰모델 객체로 생성할 때 사용할 수 있음

@Published

  • ObservableObject를 구현한 클래스 내에서 프로퍼티 선언 시 사용
  • @Published로 선언된 프로퍼티를 뷰에서 관찰할 수 있음
  • ObservableObject의 objectWillChange.send() 기능을 @Published 프로퍼티가 변경되면 자동으로 호출

@ObservedObject

  • 뷰에서 ObservableObject 타입의 인스턴스 선언 시 사용
  • ObservableObject의 값이 업데이트되면 뷰를 업데이트

@StateObject

  • 뷰에서 ObservableObject 타입의 인스턴스 선언 시 사용
  • 뷰마다 하나의 인스턴스를 생성하며, 뷰가 사라지기 전까지 같은 인스턴스 유지
  • @ObservedObject의 뷰 렌더링 시 인스턴스 초기화 이슈 해결을 위한 방법
  • 매번 인스턴스가 새롭게 생성되는 것처럼 외부에서 주입 받는 경우가 아닌 최초 생성 선언 시에 @StateObject를 사용하는 것이 적절함

@Environment

  • 미리 정의되어 있는 시스템 공유 데이터
  • 사용하려는 공유 데이터의 이름을 keyPath로 전달하여 사용
  • 시스템 공유 데이터는 가변하기에 var로 선언
  • 뷰가 생성되는 시점에 값이 자동으로 초기화

@EnvironmentObject

  • ObservableObject를 통해 구현된 타입의 인스턴스를 전역적으로 공유하며 사용
  • 앱 전역에서 공통으로 사용할 데이터를 주입 및 사용 

[참고]

https://jh-make.tistory.com/entry/SwiftUI-Property-Wrappers

 

SwiftUI Property Wrappers

Property Wrapper? SwiftUI에서 Property Wrappers는 특별한 기능을 갖는 속성을 정의하는 데 사용됩니다. Property Wrappers를 사용하면 코드를 간결하고 읽기 쉽게 만들 수 있습니다. Property Wrappers는 속성에 적

jh-make.tistory.com

 

'SwiftUI > SwiftUI' 카테고리의 다른 글

[SwiftUI] SwiftUI의 앱의 구조, @main  (0) 2024.01.04