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.