@AppStorage
es un property wrapper que nos permite hacer que la información persista utilizando fuera de la vista una clase llamada UserDefaults. Esto hace que sea posible almacenar información en una base de datos.
Imaginemos que queremos que un usuario coloque su nombre y que este se muestre pero que también se mantenga si el usuario sale y vuelve a entrar a la app. La propiedad @AppStorage
nos va a permitir guardar el valor.
Para que el valor pueda ser utilizado el mismo debe ser asignado a una key para poder identificarlo y utilizarlo en la aplicación.
@State var name: String = ""
// Usamos AppStorage y lo asignamos a una variable
@AppStorage("appStorageUserName") var appStorageUserName: String = ""
Form {
// Recogemos el nombre de usuario
TextField("Username", text: $name)
HStack {
/* Cambiamos el label del button por guardar o actualizar según el estado del appStorage */
Button(appStorageName.isEmpty ? "Guardar" : "Actualizar") {
// Guardamos valor del nombre de usuario en el appStorage
appStorageName = name
}
}
}
Lo único que haría falta sería, llamar a nuestro appStorage en el onAppear, de esta forma, cada vez que la ventana o screen se abren los valores se igualen al guardado.
.onAppear {
name = appStorageName
}
Si bien lo primero que pensamos es en datos del usuario, en el Wordle lo hemos utilizado para guardar el modo de juego favorito del usuario, de forma que cuando active o desactive el hardMode se guarde en el appStorage.
@AppStorage("hardMode") var hardMode = false
De esta forma y según su valor el usuario verá diferencias
// Si hardMode = true las reglas del juego cambian
if hardMode {
if let toastString = hardModeCorrectCheck() {
showToast(with: toastString)
return
}
if let toastString = hardModeMisplacedCheck() {
showToast(with: toastString)
return
}
}
// Si hardMode = true el título del juego cambia de color
ToolbarItem(placement: .principal) {
Text("WORDLE")
.font(.largeTitle)
.fontWeight(.heavy)
.foregroundColor(dataModel.hardMode ? Color(.systemRed) : .primary)
}