Sobes.tech
Junior

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.