brunch

You can make anything
by writing

C.S.Lewis

by 이응 Jan 30. 2024

Swift 데이터 바인딩 어노테이션

SwiftUI에서 구조체 내부에서 값을 변경하여 반영해주거나 전역적으로 값의 업데이트를 반영해주는 어노테이션에 대해 알아보자.



@State 

SwiftUI에서 읽고 쓸 수 있는 유형의 어노테이션이다. 

SwiftUI에서 뷰는 구조체로 이루어져 있어 내부 값을 변경해줄 수 없는다. 이때 @State를 이용해 변경해줄 수 있다. 기본적으로 private 선언이기 때문에 다른 뷰와 값을 소통할 수 없다. 


@Binding

@State는 자신만의 뷰에서만 변경이 가능하다. 그러나 SwiftUI는 뷰들의 부모/자식 계층관계를 가질때가 많고 구조적으로 분리하는 경우가 많다. 

이대 상위 뷰에 @State 변수가 있어 해당 값을 하위 뷰에서 활용해 변화가 주어져야 할때 사용된다. 그러므로 @State와 @Binding은 같이 사용 될때가 많다. 


@ObservedObject

다른 클래스의 변수를 구독 가능하다 즉 아예 뷰를 벗어난 외부에서 State 기능을 사용할 수 있다. ObservableObject는 이를 구현해주는 프로토콜이고 ViewModel을 만들때 주로 이것을 사용한다. @Published를 사용해 값이 변경되었을때 UI 도. 변경될 수 있는 역할을 한다. 


@StateObject 

 ObservableObject를 구독하며 값 업데이트가 발생하면 뷰를 갱신해주는 역할을 한다. 

즉 관찰 가능한 객체를 인스턴스화 하는 속성 래퍼이다. (속성래퍼 : 어떤 값이 있으면 이 값을 한 번 감싸서 저장을 위한 로직과 얻어오기 위한 로직을 어느정도 분리해서 반복을 줄이는 방법을 제공하는 속성)


@EnvironmentObject 

싱글턴 같은 인스턴스라고 볼 수 있다. 즉 이 어노테이션을 붙여주는 클래스 타입의 정의는 앱 전역적으로 사용될 데이터의 집합으로 이뤄지는게 좋을 것 이다. ObservableObject 프로토콜을 따르며 흐름은 전역적으로 사용할 데이터에 대한 클래스를 만든다. 전역적 사용을 위해 SceneDelegate에서 .environmentObject(_:) 메서드를 통해 값을 매칭합니다.

마지막으로 사용될 뷰들에서 프로퍼티로 @EnvironmentObject 어노테이션을 붙인 변수를 생성합니다.




각 어노테이션에 관한 참조 코드는 아래 애플 공식 문서를 통해 볼 수 있다. 


참고자료

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


매거진의 이전글 Swift의 async/await에 대해(동기,비동기)
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari