Descripción General del Uso

June 11, 2026 · View on GitHub

Esta descripción general proporciona una introducción rápida al uso de los componentes clave de la biblioteca AppState dentro de una View de SwiftUI. Cada sección incluye ejemplos simples que se ajustan al alcance de una estructura de vista de SwiftUI.

Definición de Valores en la Extensión de Application

Para definir el estado o las dependencias de toda la aplicación, debe extender el objeto Application. Esto le permite centralizar todo el estado de su aplicación en un solo lugar. A continuación, se muestra un ejemplo de cómo extender Application para crear varios estados y dependencias:

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 le permite definir un estado de toda la aplicación al que se puede acceder y modificar en cualquier parte de su aplicación.

Ejemplo

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 persiste el estado usando UserDefaults para garantizar que los valores se guarden entre lanzamientos de la aplicación.

Ejemplo

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 sincroniza el estado de la aplicación en múltiples dispositivos usando iCloud.

Ejemplo

import AppState
import SwiftUI

struct SyncSettingsView: View {
    @SyncState(\.darkModeEnabled) var isDarkModeEnabled: Bool

    var body: some View {
        VStack {
            Toggle("Dark Mode", isOn: $isDarkModeEnabled)
        }
    }
}

FileState

FileState se utiliza para almacenar datos más grandes o complejos de forma persistente utilizando el sistema de archivos, lo que lo hace ideal para almacenar en caché o guardar datos que no se ajustan a las limitaciones de UserDefaults.

Ejemplo

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 gestiona objetos @Model de SwiftData a través de AppState inyectando un ModelContainer compartido. Está destinado a view models, servicios y otro código que no es de vista; para vistas reactivas, use el @Query de SwiftData junto con el ModelContainer proporcionado por AppState. Las características de SwiftData requieren iOS 17+ / macOS 14+.

Ejemplo

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)
    }
}

Para más detalles, consulte la Guía de Uso de ModelState.

SecureState

SecureState almacena datos confidenciales de forma segura en el Llavero.

Ejemplo

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 proporciona acceso inmutable y de solo lectura a los valores dentro del estado de su aplicación, garantizando la seguridad al acceder a valores que no deben modificarse.

Ejemplo

import AppState
import SwiftUI

struct ExampleView: View {
    @Constant(\.user, \.name) var name: String

    var body: some View {
        Text("Username: \(name)")
    }
}

Slicing State

Slice y OptionalSlice le permiten acceder a partes específicas del estado de su aplicación.

Ejemplo

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"
            }
        }
    }
}

Mejores Prácticas

  • Use AppState en Vistas de SwiftUI: Los property wrappers como @AppState, @StoredState, @FileState, @SecureState, y otros están diseñados para ser utilizados dentro del alcance de las vistas de SwiftUI.
  • Defina el Estado en la Extensión de Application: Centralice la gestión del estado extendiendo Application para definir el estado y las dependencias de su aplicación.
  • Actualizaciones Reactivas: SwiftUI actualiza automáticamente las vistas cuando cambia el estado, por lo que no necesita actualizar manualmente la interfaz de usuario.
  • Guía de Mejores Prácticas: Para un desglose detallado de las mejores prácticas al usar AppState.

Próximos Pasos

Después de familiarizarse con el uso básico, puede explorar temas más avanzados:


Esta traducción fue generada automáticamente y puede contener errores. Si eres un hablante nativo, te agradecemos que contribuyas con correcciones a través de un Pull Request.