[iOS] 관찰 가능한 클래스 만들기(@State, @Binding)
![[iOS] 관찰 가능한 클래스 만들기(@State, @Binding)](https://inblog.ai/_next/image?url=https%3A%2F%2Finblog.ai%2Fapi%2Fog%3Ftitle%3D%255BiOS%255D%2520%25EA%25B4%2580%25EC%25B0%25B0%2520%25EA%25B0%2580%25EB%258A%25A5%25ED%2595%259C%2520%25ED%2581%25B4%25EB%259E%2598%25EC%258A%25A4%2520%25EB%25A7%258C%25EB%2593%25A4%25EA%25B8%25B0(%2540State%252C%2520%2540Binding)%26logoUrl%3Dhttps%253A%252F%252Finblog.ai%252Finblog_logo.png%26blogTitle%3Dcode-with-me&w=1920&q=75)
<따로 해석한 부분>
*트리거(trigger)란 어떤 동작이나 이벤트를 일으키거나 작동시키는 것을 의미한다. 여기서 "업데이트를 트리거하는 소스로 사용했습니다"라는 문장에서는 @State와 @Binding 프로퍼티 래퍼가 값의 변경을 감지하고, 그 변경에 따라 뷰 계층 구조를 다시 그리도록 요청한다는 것을 의미한다.
즉, 이러한 프로퍼티 래퍼들은 값이 변경될 때마다 뷰를 다시 렌더링하도록 트리거 역할을 합니다. 따라서 사용자가 인터페이스와 상호작용하거나 데이터가 변경될 때, 이러한 프로퍼티 래퍼들은 뷰의 업데이트를 시작하는 역할을 합니다.
*source of truth : 사용자 인터페이스(UI)에서는 이 용어가 데이터의 실제 원본이 되는 객체나 상태를 가리키는 데 사용되며, “신뢰할 수 있는 소스”라고 해석한다고 한다.
Working with reference types
이전 튜토리얼에서는 속성에 @State
속성을 추가하여 해당 속성을 데이터의 출처로 지정했지만, @State
프로퍼티 래퍼는 구조체나 열거형과 같은 값 타입에만 적용됩니다.
SwiftUI는 참조 타입을 데이터의 출처로 선언하는 프로퍼티 래퍼를 제공합니다: @ObservedObject
, @StateObject
, @EnvironmentObject
. 이러한 프로퍼티 래퍼를 클래스와 함께 사용하려면 클래스를 관찰 가능하게 만들어야 합니다.
Making a class observable
클래스를 관찰 가능하게 만들려면 ObservableObject
프로토콜을 채택하면 됩니다. 클래스에서 변경 시 UI 업데이트를 트리거해야 하는 프로퍼티를 식별합니다. 그런 다음 이러한 각 속성 선언에 @Published
속성을 추가합니다.
다음 튜토리얼의 시작 프로젝트에는 매일 스크럼 회의 시간을 유지하는 ScrumTimer 클래스가 포함되어 있습니다:
이 클래스는 스크럼 세션 중에 업데이트되는 여러 개의 게시된 속성을 선언합니다. 스크럼타이머는 게시된 프로퍼티의 값이 변경되면 모든 관찰자에게 알립니다.
Monitoring an object for changes
프로퍼티 선언에 다음 속성 중 하나를 추가하여 SwiftUI가 관찰 가능한 객체(observable object)를 모니터링하도록 지시할 수 있습니다. ObservedObject
, StateObject
또는 EnvironmentObject
. 이러한 래퍼 중 하나를 사용하여 선언된 뷰 프로퍼티는 뷰 계층 구조에 대한 새로운 데이터 소스를 생성합니다.
StateObject 래퍼를 사용하여 관찰 가능한 개체(observable object)를 만듭니다. App
, Scene
또는 View
에서 상태 개체(state object)를 만들 수 있습니다.
시스템이 개체를 초기화하면 해당 구조 또는 개체를 전달하는 다른 뷰에서 사용할 수 있도록 개체를 유지합니다.
App
, Scene
또는 View
와 같은 상위 소스에서 뷰가 개체를 수신했음을 나타내려면 @ObservedObject
속성 래퍼를 사용합니다. 이 상위 구조는 개체를 만들고 소유하므로 하위 뷰에는 ObservedObject
의 초기 값이 필요하지 않습니다:
그런 다음 관찰 가능한 객체의 인스턴스를 뷰의 초기화 프로그램에 전달합니다:
복잡한 보기 계층 구조에서 관찰 가능한 개체를 공유하려면 @EnvironmentObject
속성 래퍼를 사용합니다.
이니셜라이저를 통해 개체를 전달하는 대신 개체를 환경에 배치합니다. environmentObject(_:)
뷰 수정자는 뷰의 환경에 개체를 배치합니다.
그런 다음 계층 구조의 중간 뷰에 객체에 대한 참조가 없더라도 @EnvironmentObject
속성 래퍼를 사용하여 ChildView
의 모든 하위 뷰에 있는 객체에 액세스할 수 있습니다.
@EnvironmentObject
를 사용하면 이러한 중간 뷰(intermediate views)에서 불필요한 종속성을 만들지 않도록 할 수 있습니다. ParentView
와 GrandchildView
는 모두 스크럼타이머에 종속되지만 ChildView
는 그렇지 않다는 점을 주목하세요.
이 모듈에서는 @EnvironmentObject
를 사용하지 않지만 Managing model data in your app 에서 다른 프로퍼티 래퍼와 함께 자세한 내용을 확인할 수 있습니다.
Putting it all together
이미 SwiftUI의 여러 도구를 사용하여 데이터를 Scrumdinger의 사용자 인터페이스에 연결했으며, 이제 참조 유형으로 작업하는 방법도 알게 되었습니다. 다음 글에서는 SwiftUI의 앱 및 보기 수명 주기에 대해 자세히 알아보세요. 그런 다음 MeetingTimer를 사용하여 게시된 회의 속성을 관찰하는 @StateObject
를 인스턴스화합니다.
본 포스팅은 Making a class observable 문서를 번역하였습니다.