Habla sobre la codificación y decodificación de datos en UserDefaults.
sobes.tech AI
Respuesta de la IA
UserDefaults almacena datos en formato clave-valor. Para tipos de datos personalizados no soportados directamente (String, Int, Bool, Data, Array, Dictionary), se requiere codificación/decodificación. Se utiliza el protocolo Codable, que combina Encodable y Decodable.
Ejemplo de codificación de un tipo personalizado:
struct User: Codable {
let name: String
let age: Int
}
let user = User(name: "Иван", age: 30)
Con PropertyListEncoder y PropertyListDecoder se puede codificar/decodificar objetos Codable en Data para almacenarlos en UserDefaults.
Codificación:
let encoder = PropertyListEncoder()
if let encoded = try? encoder.encode(user) {
UserDefaults.standard.set(encoded, forKey: "currentUser")
}
Decodificación:
if let savedData = UserDefaults.standard.data(forKey: "currentUser") {
let decoder = PropertyListDecoder()
if let loadedUser = try? decoder.decode(User.self, from: savedData) {
print("Usuario cargado: \(loadedUser.name), edad: \(loadedUser.age)")
}
}
Otra opción (menos recomendable para nuevos proyectos): usar NSCoding heredando de NSObject.
Comparación de métodos:
| Método | Protocolo/Clase | Soporte para Tipos de Valor/Referencia | Métodos requeridos | Facilidad |
|---|---|---|---|---|
Codable |
Codable (Encodable, Decodable) |
Valor y Referencia | Implementación automática si se cumplen las condiciones | Alta |
NSCoding |
NSCoding |
Referencia (requiere NSObject) |
init(coder:), encode(with:) |
Media |
Codable es el enfoque moderno y recomendado por su facilidad de uso y generación automática. NSCoding puede ser necesario para compatibilidad con código antiguo.