Изучите iOS-разработку

Ключи среды против объекта среды в SwiftUI

Руководство с примерами

Создавая надежные и динамичные пользовательские интерфейсы в Swift, вы часто сталкиваетесь с данными, которые необходимо использовать в разных частях вашего приложения. SwiftUI предоставляет два основных механизма передачи данных вниз по иерархии представлений: @EnvironmentObject и @EnvironmentKey. Эти функции играют решающую роль в поддержании чистого и эффективного потока данных в вашем приложении. В этой записи блога мы рассмотрим различия между @EnvironmentObject и @EnvironmentKey и приведем примеры, иллюстрирующие их использование.

Понимание объекта среды

@EnvironmentObject — это оболочка свойств, которая позволяет вам совместно использовать экземпляр класса в иерархии представлений SwiftUI. Это невероятно полезно, когда у вас есть данные, к которым требуется доступ многим представлениям, например статус аутентификации пользователя, пользовательские настройки или модели данных для всего приложения.

Вот как вы можете использовать @EnvironmentObject:

class UserData: ObservableObject {
    @Published var username: String = "Guest"
}

struct ContentView: View {
    @EnvironmentObject var userData: UserData
    
    var body: some View {
        VStack {
            Text("Welcome, \(userData.username)!")
            EditUsernameView()
        }
    }
}

struct EditUsernameView: View {
    @EnvironmentObject var userData: UserData
    
    var body: some View {
        TextField("Enter your username", text: $userData.username)
    }
}

@main
struct MyApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
                .environmentObject(UserData())
        }
    }
}

В этом примере класс UserData отмечен как ObservableObject и содержит свойство @Published username. Прикрепив экземпляр UserData с помощью .environmentObject(UserData()), все дочерние представления в иерархии представлений смогут получить доступ к свойству userData и изменить его.

Изучение EnvironmentKey

Хотя @EnvironmentObject подходит для обмена сложными моделями данных, @EnvironmentKey предназначен для обмена простыми значениями, такими как цвета, шрифты или параметры конфигурации.

Вот как вы можете использовать @EnvironmentKey:

struct CustomFontKey: EnvironmentKey {
    static let defaultValue: Font = .system(.body)
}

extension EnvironmentValues {
    var customFont: Font {
        get { self[CustomFontKey.self] }
        set { self[CustomFontKey.self] = newValue }
    }
}

struct ContentView: View {
    @Environment(\.customFont) var font: Font
    
    var body: some View {
        Text("Custom Font Example")
            .font(font)
    }
}

@main
struct MyApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
                .environment(\.customFont, .largeTitle)
        }
    }
}

В этом примере мы определяем пользовательский CustomFontKey, соответствующий EnvironmentKey. Затем мы расширяем EnvironmentValues, чтобы создать оболочку свойства customFont, которая позволяет нам устанавливать и получать пользовательский шрифт. Используя .environment(\.customFont, .largeTitle), мы передаем пользовательский шрифт вниз по иерархии представлений.

Выбор между EnvironmentObject и EnvironmentKey

Выбор между @EnvironmentObject и @EnvironmentKey зависит от характера данных, которыми вы делитесь. Используйте @EnvironmentObject для более сложных моделей данных, требующих наблюдения и обновления, и используйте @EnvironmentKey для более простых значений, таких как настройки, стили или конфигурации.

Освоив использование @EnvironmentObject и @EnvironmentKey, вы сможете эффективно управлять данными и обмениваться ими в представлениях SwiftUI, создавая удобный и отзывчивый пользовательский интерфейс.

Заключение

В этом сообщении блога мы рассмотрели различия между @EnvironmentObject и @EnvironmentKey в SwiftUI. Мы научились использовать их для совместного использования данных в иерархии представлений, будь то сложные объекты @EnvironmentObject или простые значения с @EnvironmentKey. Правильно используя эти функции, вы можете создавать мощные и гибкие пользовательские интерфейсы в своих приложениях Swift. Приятного кодирования!