Sobes.tech
Junior

Fale sobre codificação e decodificação de dados no UserDefaults.

sobes.tech IA

Resposta da IA

O UserDefaults armazena dados em formato de pares chave-valor. Para tipos de dados personalizados não suportados diretamente (String, Int, Bool, Data, Array, Dictionary), é necessário codificar/decodificar. Utiliza-se o protocolo Codable, que combina Encodable e Decodable.

Exemplo de codificação de um tipo personalizado:

struct User: Codable {
    let name: String
    let age: Int
}

let user = User(name: "Иван", age: 30)

Com PropertyListEncoder e PropertyListDecoder, é possível codificar/decodificar objetos Codable em Data para armazenamento no UserDefaults.

Codificação:

let encoder = PropertyListEncoder()
if let encoded = try? encoder.encode(user) {
    UserDefaults.standard.set(encoded, forKey: "currentUser")
}

Decodificação:

if let savedData = UserDefaults.standard.data(forKey: "currentUser") {
    let decoder = PropertyListDecoder()
    if let loadedUser = try? decoder.decode(User.self, from: savedData) {
        print("Utilizador carregado: \(loadedUser.name), idade: \(loadedUser.age)")
    }
}

Outra abordagem (menos recomendada para novos projetos): usar NSCoding com herança de NSObject.

Comparação de métodos:

Método Protocolo/Classe Suporte para Tipos de Valor/Referência Métodos necessários Facilidade
Codable Codable (Encodable, Decodable) Valor & Referência Implementação automática se as condições forem atendidas Alta
NSCoding NSCoding Referência (requer NSObject) init(coder:), encode(with:) Média

Codable é a abordagem moderna e recomendada devido à sua simplicidade de uso e à geração automática. NSCoding pode ser necessário para compatibilidade com código antigo.