Изучите 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. Приятного кодирования!