@Environment 프로퍼티 래퍼: .environment 수정자를 통해 주입된 것을 꺼내 쓸 수 있게 해주는 것.
1. 기본 구조
struct MyView: View { @Environment(\.colorScheme) var colorScheme // 시스템 다크/라이트 모드 var body: some View { Text(colorScheme == .dark ? "Dark Mode" : "Light Mode") } } - @Environment(.colorScheme)는 시스템에서 주입해주는 값을 읽는 것.
- 읽기 전용이라서 값 자체를 직접 바꿀 수는 없다.
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() } } } } - @Environment(.managedObjectContext)를 선언하면 부모에서 .environment(\managedObjectContext, ...)로 넘겨준 컨텍스트를 자동으로 불러와서 사용할 수 있음.
- 즉, MainTabView -> TodoListView -> 그 안의 모든 자식 뷰까지 전파됨.
정리
- @Environment는 상위 뷰나 시스템이 제공하는 값에 접근할 때 씀.
- .environment 수정자로 값을 "전역 주입"할 수 있음.
- CoreData 컨텍스트나 시스템 환경 값에 자주 쓰임
- 직접 커스텀 키를 만들어서 앱만의 환경 값도 전달 가능.
주입 개념
주입: 내가 직접 가져오지 않고, 누군가가 "넣어줘서"쓰는 것.
SwiftUI의 .environment도 똑같다. 상위 뷰(부모)가 어떤 값을 넣어줘서 자식 뷰는 @Environment로 꺼내 쓰는 것이다.
왜 쓰나?
- 매번 인자로 전달하는 번거로움 해결
// 매번 파라미터로 넘기면 ChildView(themeColor: .red) // 대신 ChildView() // 그냥 불러도 .environment(\.themeColor, .red) // 자동으로 들어감 - 자식 입장에선 그냥 @Environment 쓰면 끝난다.
- 전역 값 공유
- 시스템이 알아서 넣어주는 것도 있음(예: colorScheme, locale)
- 내가 원하는 걸 전역으로 뿌릴 수도 있다. (예: Core Data context, 유저 정보 등)
정리
주입 = 상위에서 한 번 넣어주면, 하위 뷰들은 그냥 꺼내 쓸 수 있게 하는 것. 계속 이어주는 파이프라인 같은 느낌.