← 메인으로

0821 @Environment

@Environment 프로퍼티 래퍼: .environment 수정자를 통해 주입된 것을 꺼내 쓸 수 있게 해주는 것.

1. 기본 구조

struct MyView: View { @Environment(\.colorScheme) var colorScheme // 시스템 다크/라이트 모드 var body: some View { Text(colorScheme == .dark ? "Dark Mode" : "Light Mode") } } 

2. Core Data 예시

struct TodoListView: View { @Environment(\.managedObjectContext) private var viewContext // 주입받음 @FetchRequest( sortDescriptors: [NSSortDescriptor(keyPath: \Todo.timestamp, ascending: true)] ) private var todos: FetchedResults<Todo> var body: some View { List { ForEach(todos) { todo in Text(todo.title ?? "Untitled") } } .toolbar { Button("Add") { let newTodo = Todo(context: viewContext) newTodo.timestamp = Date() try? viewContext.save() } } } } 

정리

주입 개념

주입: 내가 직접 가져오지 않고, 누군가가 "넣어줘서"쓰는 것.

SwiftUI의 .environment도 똑같다. 상위 뷰(부모)가 어떤 값을 넣어줘서 자식 뷰는 @Environment로 꺼내 쓰는 것이다.

왜 쓰나?

  1. 매번 인자로 전달하는 번거로움 해결
// 매번 파라미터로 넘기면 ChildView(themeColor: .red) // 대신 ChildView() // 그냥 불러도 .environment(\.themeColor, .red) // 자동으로 들어감 
  1. 전역 값 공유
    • 시스템이 알아서 넣어주는 것도 있음(예: colorScheme, locale)
    • 내가 원하는 걸 전역으로 뿌릴 수도 있다. (예: Core Data context, 유저 정보 등)

정리

주입 = 상위에서 한 번 넣어주면, 하위 뷰들은 그냥 꺼내 쓸 수 있게 하는 것. 계속 이어주는 파이프라인 같은 느낌.