Programming/Mac & iOS

[iOS] SwiftUI Foundation

MB Kyle K. 2025. 10. 11. 15:33

Protocols

App 프로토콜
 
앱의 구조를 설정하기 위한 프로토콜. @main을 통해서 main() 메소드의 기본 구현을 통해 entry point를 제공한다. Scene 프로토콜을 구현하여 App의 body를 구현한다. 각 scene은 각각의 root view와 life cycle을 가진다. 모든 scene을 넘어서 데이터를 공유하기 위해서 App을 구현한 곳에 StateObject 등을 구현하여 사용하는 방법이 있다. 공유하는 데이터의 성격에 따라 ObserbedObject나 EnvironmentObject 등을 사용한다. @preconcurrency @MainActor는 기본적으로 상속됨으로써 isolation 처리되어 있다. @MainActor를 opt out 처리하기 위해서는 extension에서 comformance를 선언하도록 한다.
 
View 프로토콜
 
View를 생성하기 위한 프로토콜. @body의 computed property를 통해서 구현된 view를 제공한다. 각 view를 배치하고 쌓아서 구성하고, 각 view는 modifier를 제공하여 각 세부사항을 조정할 수 있도록 한다. Layout Modifiers, Accessiblity modifiers, Input and Event modifiers 등을 제공한다. App 프로토콜과 똑같이 @preconcurrency @MainActor는 기본적으로 상속됨으로써 isolation 처리되어 있다. @MainActor를 opt out 처리하기 위해서는 extension에서 comformance를 선언하도록 한다.
 

Property Wrappers

StateObject
 
App, Scene, View 등에서 reference type을 사용한 데이터 소스를 제공하기 위해서 사용한다. StateObject에 데이터 소스를 제공하이 휘애서 ObserableObject를 구현한 클래스를 사용한다. StateObject는 다른 View에서 사용되는 StateObejct와의 충돌을 피하기 위해서 private를 사용하여 memeberwise하게 처리한다. 
 
ObservableObject
 
@published로 선언된 property들의 값 변화를 알리기 위해서 사용한다. 값의 변화가 일어나면 바인딩된 object를 통해서 전달된다.
 
ObservedObject
 
ObservableObject에서 데이터의 변화에 따라 발행되는 event를 구독하고 싶을 때에 사용하는 property wrapper이다. 일반적으로 Subview에서 spuer view의 StateObejct를 이어 받아서 사용할 때에 ObservedObject를 활용하여 구독한다.
 
EnvironmentObject
 
View 자체에서 data model의 데이터 변경 이벤트를 전파하기 위해서 StateObejct를 사용한다. 하지만 앱 생성 단계에서 여러 view들과의 데이터 변경 이벤트를 공유하기 위해서는 EnvironmentObject를 사용한다. 
 
Binding
 
데이터와 데이터가 표시되는 view 간의 연결을 위해서 사용한다. Object 단위가 아니라 property 단위의 데이터 연결을 위해서 사용한다. object 단위의 데이터 연결을 위해서는 ObservableObject/ObservedObject를 참조하는 것이 좋다.
 

LifeCycles

onAppear
 
view가 표시되는 시점에서 호출되는 lifecycle이다. view가 보여지기 전에 처리해야하는 비지니스 로직을 구현한다. view가 렌더링되기 전에 synchronous로 처리된다. 처리 자체가 렌더링되는 타이밍에 비해서 오래 걸리거나 완료 시점이 보장이 안되면 task를 쓰도록 한다.
 
task
 
view가 표시되는 시점에 호출되는 lifecycle이다. 비동기로 처리되기 때문에 view가 렌더링되는 동작에 영향을 주지 않고 비동기로 처리하고 싶은 비지니스 로직을 구현하기 위해서 사용한다.
 
onDisappear
 
view가 사라지는 시점에 처리되는 lifecycle이다. 일반적으로 view가 사라지는 시점에 처리되지만, 경우에 따라서 호출이 안되는 경우도 있다. 예를 들어서 navigation stack에서 pop되어 사라지는 경우 등이 있다.
 
onChange
 
view에 선언된 property의 변화가 있을 때마다 이에 해당하는 비지니스 로직을 실행하기 위해서 사용한다.
 

Machanisms

State Containers (Reference)
 
state는 당연하게도 wrapper type에 불과하다. 대부분의 단방향 구조를 가진 아키텍처들은 비슷한 구조의 클래스들을 가진다. 대표적으로 데이터의 변경을 관찰하고 이를 이벤트로 래핑하여 전달하는 구조를 공유한다. 여기서 발생할 수 있는 가장 큰 문제는 변경을 관찰해야하는 데이터들이 한곳에 밀집될 수 있다는 이슈이다. 그리고 이는 잦은 데이터 변경으로 인한 view의 불필요한 업데이트를 유발할 수 잇다. 더욱이 이 데이터 변화가 view의 업데이트가 불필요한 경우에도 view 업데이트를 발생시키기도 한다. StateContiner와 StateType을 이용하여 불필요한 데이터 변경으로 인한 이벤트 발행을 제한할 수 있다.