Sobes.tech
Junior

¿Cómo guardar y leer la estructura de datos usando User Defaults?

sobes.tech AI

Respuesta de la IA

User Defaults solo almacena un conjunto limitado de tipos: Data, String, Number, Date, Array, Dictionary. Para almacenar estructuras de datos personalizadas, es necesario codificarlas en Data y decodificarlas de nuevo.

Se utiliza el protocolo Codable (una combinación de Encodable y Decodable).

  1. Definición de la estructura: La estructura debe cumplir con el protocolo Codable.

    struct MyData: Codable {
        let id: Int
        let name: String
        let isActive: Bool
    }
    
  2. Guardar: Codificación de la estructura en Data usando JSONEncoder y guardarla en User Defaults.

    let myStruct = MyData(id: 1, name: "Example", isActive: true)
    
    // Codificar en Data
    let encoder = JSONEncoder()
    if let encodedData = try? encoder.encode(myStruct) {
        // Guardar Data con la clave
        UserDefaults.standard.set(encodedData, forKey: "myCustomData")
    } else {
        // Manejo de error de codificación
        print("Error al codificar la estructura")
    }
    
  3. Leer: Leer Data desde User Defaults y decodificar de nuevo en la estructura usando JSONDecoder.

    // Obtener Data por clave
    if let savedData = UserDefaults.standard.data(forKey: "myCustomData") {
        // Decodificar Data en la estructura
        let decoder = JSONDecoder()
        if let loadedStruct = try? decoder.decode(MyData.self, from: savedData) {
            // Usar la estructura cargada
            print("Estructura cargada: \(loadedStruct)")
        } else {
            // Manejo de error de decodificación
            print("Error al decodificar los datos")
        }
    } else {
        // No se encontraron datos para la clave
        print("No se encontraron datos para la clave")
    }
    

Puntos clave:

  • User Defaults no está diseñado para almacenar grandes volúmenes de datos o información confidencial.
  • El uso de Codable y JSONEncoder/JSONDecoder es la forma estándar de guardar tipos personalizados en Data.
  • Se debe usar try? y manejar posibles errores de codificación/decodificación.
  • Para guardar arreglos de estructuras, también se usa Codable.
// Ejemplo de guardar un arreglo de estructuras
let dataArray: [MyData] = [
    MyData(id: 1, name: "A", isActive: true),
    MyData(id: 2, name: "B", isActive: false)
]

let encoder = JSONEncoder()
if let encodedArrayData = try? encoder.encode(dataArray) {
    UserDefaults.standard.set(encodedArrayData, forKey: "myCustomArray")
}

// Ejemplo de leer un arreglo de estructuras
if let savedArrayData = UserDefaults.standard.data(forKey: "myCustomArray") {
    let decoder = JSONDecoder()
    if let loadedArray = try? decoder.decode([MyData].self, from: savedArrayData) {
        print("Arreglo cargado: \(loadedArray)")
    }
}