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).
-
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 } -
Guardar: Codificación de la estructura en
DatausandoJSONEncodery 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") } -
Leer: Leer
Datadesde User Defaults y decodificar de nuevo en la estructura usandoJSONDecoder.// 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
CodableyJSONEncoder/JSONDecoderes la forma estándar de guardar tipos personalizados enData. - 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)")
}
}