본문 바로가기
Ios/Swift UI

@Environment

by 잘먹는 개발자 에단 2024. 7. 26.

@Environment

- 프로퍼티 Wrapper 이다. ( 프로퍼티 감싸는 놈 ) 

    ㄴ 그렇기 때문에 값을 꺼내서 쓰려면 ?.wrappedValue 로 꺼내야 한다.

- 다른 뷰에서 @Environment 프로토콜을 채택한 프로퍼티가 있으면 그걸 갖다가 가져다 쓰는 해당 뷰의 UI 갱신 여부와 엮을 수 있다.

    ㄴ 마치 Redux의 전역 변수 같은 느낌이다. 

 

 

어떻게 쓸까? * https://seons-dev.tistory.com/entry/SwiftUI-Environment-%ED%94%84%EB%A1%9C%ED%8D%BC%ED%8B%B0-%EB%9E%98%ED%8D%BC 참고

 

 

1. 먼저 환경 키를 생성한다. 

예를 들어서 이렇게 캡션 컬러키를 Environment 변수로 만들고 싶다면 다음과 같이 EnvironmentKey 프로토콜을 구현하는 구조체를 만든다음에 기본값을 설정할 때는 defaultValue 정적 상수에 초기화 한다.

private struct CaptionColorKey: EnvironmentKey {
  static let defaultValue = Color(.secondarySystemBackground)
}

 

2. 키를 만들었으니까 값을 만들자. EnvironmentValues 타입에 우리가 사용할 이름을 설정하고, getter와 setter를 정의한다.

extension EnvironmentValues {
  var captionBackgroundColor: Color {
    get { self[CaptionColorKey.self] }
    set { self[CaptionColorKey.self] = newValue }
  }
}

 

3. 이후에 사용할 때는 

@Environment(\.captionBackgroundColor) var captionBackColor

로 사용하면 된다. 그럼 해당 뷰가 바뀔때마다 해당 환경변수를 구독한 뷰들은 리렌더링 되게 된다. 

 

 

** 뷰 수정자를 넣을 수도 있다. (선택사항)

ContentView()
  .environment(\.captionBackgroundColor, .yellow)

 

 

 

 

@Environment(\.EditMode) var editMode

- 사용자가 뷰의 내용을 편집할 수 있는지 여부를 확인

 

Swift Tutorials - working with ui controls에서 다음의 코드에서 등장

import SwiftUI

struct ProfileHost: View{
	// ModelData를 가져와서 이 뷰의 환경변수로 사용할 것임!
	@Environment(ModelData.self) var modelData
    @Environment(\.editMode) var editMode
    @State private var draftProfile = Profile.default
    
    
    var body : some View{
    	if editMode?.wrappedValue.isEditing == true{
        	Text("편집모드")
        }
    }
    .
    .
    .
    .
}

#Preview{
.
.
.
.
}