Обзор использования

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.

Следующие шаги

После ознакомления с основами использования вы можете изучить более сложные темы:


Этот перевод был сгенерирован автоматически и может содержать ошибки. Если вы носитель языка, мы будем признательны за ваши исправления через Pull Request.