[SwiftUI] @Environment (feat. 다크모드, 라이트 모드)

이정훈·2023년 2월 27일
0

SwiftUI

목록 보기
1/4
post-thumbnail

Environment property wrapper 속성에 대하여 알아보자

@Environment


Apple 문서에는 다음과 같이 설명 되어 있다.

Environment

A property wrapper that reads a value from a view’s environment.

view의 환경과 관련된 값을 읽을 수 있는 property wrapper라고 한다..

과연 저 환경과 관련된 값이 무엇일까..?

위 Apple 문서에 추가적으로 설명되어 있기를..

Indicate the value to read using an EnvironmentValues key path in the property declaration

환경과 관련된 값을 EnvironmentValues의 key path로 나타낸다고 나와있다.

그럼 환경과 관련된 값은 EnvironmentValues에 정의 되어 있는 것일까?

그래서 EnvironmentValues도 찾아 봤다.

EnvironmentValue


Apple 문서에는 다음과 같이 설명 되어 있다.

EnvironmentValues

A collection of environment values propagated through a view hierarchy.

EnvironmentValues는 view 계층을 통해 전달되는 환경 값을 모아 둔 collection이라고 정리할 수 있다.

아 그렇다면 상위 view에서 설정한 Environment의 값은 그 하위 view에서도 같은 값으로 유지 되겠구나!

그럼 EnvironmentValues가 가지고 있는 값의 종류는 무엇이 있을까?

위의 문서에서 친절하게도 많은 값들을 소개해 주고 있다.

예를 들면 Text와 관련된 font 프로퍼티, View attributes와 관련된 backgroundStyle 프로퍼티, Action과 관련된 dismiss 프로퍼티, Display characteristics와 관련된 colorScheme 프로퍼티 등이 존재한다.(너무 많아서 다 적지 못하였다.)

원하는 프로퍼티 값을 Environment 속성의 key path로 전달하면 시스템에 설정되어 있는 값으로 변수가 초기화 되고, 해당 view의 하위 view도 동일한 값으로 설정된다.

예시 (다크 모드와 라이트 모드 설정)


현재 iOS 시스템이 다크 모드를 사용하고 있다고 가정하겠다.

@Environment(\.colorScheme) var colorScheme: ColorScheme

현재 colorScheme 변수에는 ColorScheme.dark로 값이 지정되어 있다.

그럼 아래와 같이 colorScheme 변수의 값이 무엇인지에 따라 서로 다른 view를 보여줄 수 있다.

if colorScheme == .dark { // Checks the wrapped value.
    DarkContent()
} else {
    LightContent()
}

또 다른 특징으로는

  1. 사용자가 어플리케이션을 사용하는 중 시스템 setting을 다크 모드에서 라이트 모드로 변경한다면 SwiftUI는 colorScheme 변수의 값이 변경됨을 감지하고 view를 새롭게 update한다.

  2. 시스템의 설정을 따르지 않고 override 혹은 custom environment values를 사용하고자 한다면 environment(_:_:) modifier를 사용한다.

  3. 위의 custom environment values는 EnvironmentKey protocol을 따른다.

profile
새롭게 알게된 것을 기록하는 공간

0개의 댓글