Обзор использования
June 11, 2026 · View on GitHub
Этот обзор представляет собой краткое введение в использование ключевых компонентов библиотеки AppState в SwiftUI View. Каждый раздел содержит простые примеры, которые вписываются в рамки структуры представления SwiftUI.
Определение значений в расширении приложения
Для определения состояния или зависимостей в масштабах всего приложения необходимо расширить объект Application. Это позволяет централизовать все состояние вашего приложения в одном месте. Вот пример того, как расширить Application для создания различных состояний и зависимостей:
import AppState
extension Application {
var user: State<User> {
state(initial: User(name: "Guest", isLoggedIn: false))
}
var userPreferences: StoredState<String> {
storedState(initial: "Default Preferences", id: "userPreferences")
}
var darkModeEnabled: SyncState<Bool> {
syncState(initial: false, id: "darkModeEnabled")
}
var userToken: SecureState {
secureState(id: "userToken")
}
@MainActor
var largeDataset: FileState<[String]> {
fileState(initial: [], filename: "largeDataset")
}
}
State
State позволяет определить состояние в масштабах всего приложения, к которому можно получить доступ и изменить его в любом месте вашего приложения.
Пример
import AppState
import SwiftUI
struct ContentView: View {
@AppState(\.user) var user: User
var body: some View {
VStack {
Text("Hello, \(user.name)!")
Button("Log in") {
user.isLoggedIn.toggle()
}
}
}
}
StoredState
StoredState сохраняет состояние с помощью UserDefaults, чтобы гарантировать, что значения сохраняются между запусками приложения.
Пример
import AppState
import SwiftUI
struct PreferencesView: View {
@StoredState(\.userPreferences) var userPreferences: String
var body: some View {
VStack {
Text("Preferences: \(userPreferences)")
Button("Update Preferences") {
userPreferences = "Updated Preferences"
}
}
}
}
SyncState
SyncState синхронизирует состояние приложения на нескольких устройствах с помощью iCloud.
Пример
import AppState
import SwiftUI
struct SyncSettingsView: View {
@SyncState(\.darkModeEnabled) var isDarkModeEnabled: Bool
var body: some View {
VStack {
Toggle("Dark Mode", isOn: $isDarkModeEnabled)
}
}
}
FileState
FileState используется для постоянного хранения больших или более сложных данных с помощью файловой системы, что делает его идеальным для кэширования или сохранения данных, которые не вписываются в ограничения UserDefaults.
Пример
import AppState
import SwiftUI
struct LargeDataView: View {
@FileState(\.largeDataset) var largeDataset: [String]
var body: some View {
List(largeDataset, id: \.self) { item in
Text(item)
}
}
}
ModelState
🍎 ModelState управляет объектами SwiftData @Model через AppState, внедряя общий ModelContainer. Он предназначен для моделей представлений, служб и другого кода, не относящегося к представлениям; для реактивных представлений используйте @Query SwiftData вместе с предоставляемым AppState ModelContainer. Функции SwiftData требуют iOS 17+ / macOS 14+.
Пример
import AppState
import SwiftData
private func makeItemContainer() -> ModelContainer {
do {
return try ModelContainer(for: Item.self)
} catch {
fatalError("Failed to create ModelContainer: \(error)")
}
}
extension Application {
var modelContainer: Dependency<ModelContainer> {
modelContainer(makeItemContainer())
}
var items: ModelState<Item> {
modelState(container: \.modelContainer)
}
}
@MainActor
final class ItemsViewModel: ObservableObject {
@ModelState(\.items) var items: [Item]
func add(_ item: Item) {
$items.insert(item)
}
}
Для получения дополнительных сведений см. Руководство по использованию ModelState.
SecureState
SecureState надежно хранит конфиденциальные данные в связке ключей.
Пример
import AppState
import SwiftUI
struct SecureView: View {
@SecureState(\.userToken) var userToken: String?
var body: some View {
VStack {
if let token = userToken {
Text("User token: \(token)")
} else {
Text("No token found.")
}
Button("Set Token") {
userToken = "secure_token_value"
}
}
}
}
Constant
Constant предоставляет неизменяемый доступ только для чтения к значениям в состоянии вашего приложения, обеспечивая безопасность при доступе к значениям, которые не должны изменяться.
Пример
import AppState
import SwiftUI
struct ExampleView: View {
@Constant(\.user, \.name) var name: String
var body: some View {
Text("Username: \(name)")
}
}
Slicing State
Slice и OptionalSlice позволяют получить доступ к определенным частям состояния вашего приложения.
Пример
import AppState
import SwiftUI
struct SlicingView: View {
@Slice(\.user, \.name) var name: String
var body: some View {
VStack {
Text("Username: \(name)")
Button("Update Username") {
name = "NewUsername"
}
}
}
}
Лучшие практики
- Используйте
AppStateв представлениях SwiftUI: обертки свойств, такие как@AppState,@StoredState,@FileState,@SecureStateи другие, предназначены для использования в области представлений SwiftUI. - Определяйте состояние в расширении приложения: централизуйте управление состоянием, расширяя
Applicationдля определения состояния и зависимостей вашего приложения. - Реактивные обновления: SwiftUI автоматически обновляет представления при изменении состояния, поэтому вам не нужно вручную обновлять пользовательский интерфейс.
- Руководство по лучшим практикам: для подробного описания лучших практик при использовании AppState.
Следующие шаги
После ознакомления с основами использования вы можете изучить более сложные темы:
- Изучите использование FileState для сохранения больших объемов данных в файлы в Руководстве по использованию FileState.
- 🍎 Узнайте, как управлять моделями SwiftData через AppState, в Руководстве по использованию ModelState.
- Узнайте о константах и о том, как их использовать для неизменяемых значений в состоянии вашего приложения, в Руководстве по использованию констант.
- Узнайте, как Dependency используется в AppState для обработки общих служб, и посмотрите примеры в Руководстве по использованию зависимостей состояния.
- Углубитесь в более сложные методы SwiftUI, такие как использование
ObservedDependencyдля управления наблюдаемыми зависимостями в представлениях, в Руководстве по использованию ObservedDependency. - Для более сложных методов использования, таких как создание «точно в срок» и предварительная загрузка зависимостей, см. Руководство по расширенному использованию.
Этот перевод был сгенерирован автоматически и может содержать ошибки. Если вы носитель языка, мы будем признательны за ваши исправления через Pull Request.