
EnvironmentValues 에 대해 알아보도록 합시다.
Environment
SwiftUI에서는 뷰를 구성하는 데 필요한 각종 환경 설정과 관련된 정보를 EnvironmentValues타입이 관리합니다.
colorScheme, timeZone, locale, calendar, layoutDirection, sizeCategory, undoManager등 기존에는 UITraitCollection을 비롯해 다양한 클래스에서 나뉘어 사용하고 관리되던 속성들을 이제 EnvironmentValues 하나에 모두 담아서 쉽게 접근하고 관리할 수 있습니다.
이 EnvironmentValues는 프레임워크에 의해 별도로 관리되고 있으므로 어떤 뷰에서든 접근할 수 있는데, 이때 얻게 되는 값은 상위 계층의 뷰가 가진 환경 요소를 그대로 상속받게 됩니다. 단, 하위 계층에 있는 뷰에서 개별적으로 다른 환경을 구성했다면 그 뷰에 속한 자식 뷰들은 변경된 값을 우선 사용하게 됩니다.

위 그림을 보게 되면 ColorScheme을 최상위 뷰에 dark로 지정하면 그 자식 뷰 들은 자동으로 DarkMode가 됩니다. 하지만 자식 뷰 중 하나에 light 값을 주게 되면, 해당 뷰와 그 뷰의 아래 있는 뷰는 LightMode가 기본값이 됩니다. 이렇게 SwiftUI의 각 환경 요소는 뷰 계층 구조에 영향을 받으며, 동적으로 제어할 수 있습니다.
EnvironmentValues 예시
Environment는 사용된 뷰와 그 뷰의 서브 트리에 대해 EnvironmentValues의 특정 요소를 원하는 값으로 변경시키기 위한 수식어 입니다.
| Accessing Color Schemes | Accessing View Settings |
| colorScheme | calendar |
| ColorScheme | edithMode |
| colorSchemeConrast | isEnabled |
| ColorSchemeConrast | locale |
| PresentationMode | |
| timeZone | |
| layoutDirection | |
| sizeCategory | |
| undoManager |
이들 중 하나의 값을 선택하여 설정하는거겠죠?
사용예시
예시를 하나 들어보겠습니다.
@Environment(\.colorScheme) var colorScheme: ColorScheme
contentView에 위처럼 정의를 하고 아래와 같이 활용합니다.
if colorScheme == .dark {
DarkContent()
} else {
LightContent()
}
공식 문서에 따르면
- 값이 변하면 뷰도 그에 값에 맞춰 변합니다.
- 프로퍼티 래퍼는 설정하지 않으면 기본적으로 Default 입니다.
- 오버라이드를 할 수 있고 커스텀할 수도 있습니다.
- 좀 더 자세한 정보를 원하면
EnvironmentKey(protocol) 를 확인 하면 됩니다.
만약 내가 기본값으로 되어있는 뷰의 특정 속성을 변경하고싶다 라는 생각이 들면 EnvironmentValues를 사용 하면 됩니다.
읽어주셔서 감사합니다🤟
'SWIFTUI > Grammar' 카테고리의 다른 글
| SwiftUI를 위한 Clean 아키텍처 (1) | 2021.04.06 |
|---|---|
| SwiftUI : @Environment 프로퍼티 래퍼 (0) | 2021.04.06 |
| SwiftUI : EnvironmentObject '뷰간에 데이터 공유' (1) | 2021.04.05 |
| SwiftUI : #2 MVVM의 간단한 예제 (1) | 2021.02.17 |
| SwiftUI : #1 디자인 패턴 과 MVVM (Design Patterns and MVVM) (0) | 2021.02.15 |





