Что такое environment в SwiftUI и как его настроить?

«Что такое environment в SwiftUI и как его настроить?» — вопрос из категории SwiftUI, который задают на 22% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Environment (окружение) в SwiftUI — это механизм для передачи зависимостей (данных, объектов, значений) через иерархию представлений без явной передачи через инициализаторы каждого view.

Основные инструменты:

  • @Environment — для чтения системных или кастомных значений.
  • @EnvironmentObject — для передачи ссылочных типов (ObservableObject).
  • Модификатор .environment() — для установки значений.

Как создать и использовать кастомное environment-значение:

  1. Определите ключ:
    struct ThemeKey: EnvironmentKey {
    static let defaultValue: Color = .blue // Значение по умолчанию
    }
  2. Расширьте EnvironmentValues:
    extension EnvironmentValues {
    var theme: Color {
        get { self[ThemeKey.self] }
        set { self[ThemeKey.self] = newValue }
    }
    }
  3. Используйте в дочернем view:

    struct ContentView: View {
    @Environment(.theme) var theme // Чтение значения
    
    var body: some View {
        Text("Hello")
            .foregroundColor(theme)
    }
    }
  4. Установите значение в родительском view:
    ParentView()
    .environment(.theme, .red) // Установка значения

    Ключевое отличие от @EnvironmentObject: @Environment работает с value-типами и системными настройками (размер шрифта, locale), а @EnvironmentObject — для общих моделей данных (ObservableObject).