Junior
Como guardar e ler estruturas de dados usando User Defaults?
sobes.tech IA
Resposta da IA
O User Defaults armazena apenas um conjunto limitado de tipos: Data, String, Number, Date, Array, Dictionary. Para armazenar estruturas de dados personalizadas, é necessário codificá-las em Data e decodificá-las de volta.
O protocolo utilizado é Codable (uma combinação de Encodable e Decodable).
-
Definição da estrutura: A estrutura deve cumprir o protocolo
Codable.struct MyData: Codable { let id: Int let name: String let isActive: Bool } -
Guardar: Codificar a estrutura em
DatausandoJSONEncodere guardá-la no User Defaults.let myStruct = MyData(id: 1, name: "Example", isActive: true) // Codificar em Data let encoder = JSONEncoder() if let encodedData = try? encoder.encode(myStruct) { // Guardar Data com a chave UserDefaults.standard.set(encodedData, forKey: "myCustomData") } else { // Tratamento de erro de codificação print("Falha ao codificar a estrutura") } -
Ler: Ler
Datado User Defaults e decodificar de volta na estrutura usandoJSONDecoder.// Obter Data pela chave if let savedData = UserDefaults.standard.data(forKey: "myCustomData") { // Decodificar Data na estrutura let decoder = JSONDecoder() if let loadedStruct = try? decoder.decode(MyData.self, from: savedData) { // Usar a estrutura carregada print("Estrutura carregada: \(loadedStruct)") } else { // Tratamento de erro de decodificação print("Falha ao decodificar os dados") } } else { // Dados não encontrados para a chave print("Nenhum dado encontrado para a chave") }
Pontos-chave:
- User Defaults não é destinado ao armazenamento de grandes volumes de dados ou informações confidenciais.
- O uso de
CodableeJSONEncoder/JSONDecoderé a forma padrão de guardar tipos personalizados emData. - Deve-se usar
try?e tratar erros potenciais de codificação/decodificação. - Para guardar arrays de estruturas, também se usa
Codable.
// Exemplo de guardar um array de estruturas
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")
}
// Exemplo de ler um array de estruturas
if let savedArrayData = UserDefaults.standard.data(forKey: "myCustomArray") {
let decoder = JSONDecoder()
if let loadedArray = try? decoder.decode([MyData].self, from: savedArrayData) {
print("Array carregado: \(loadedArray)")
}
}