Sobes.tech
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).

  1. Definição da estrutura: A estrutura deve cumprir o protocolo Codable.

    struct MyData: Codable {
        let id: Int
        let name: String
        let isActive: Bool
    }
    
  2. Guardar: Codificar a estrutura em Data usando JSONEncoder e 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")
    }
    
  3. Ler: Ler Data do User Defaults e decodificar de volta na estrutura usando JSONDecoder.

    // 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 Codable e JSONEncoder/JSONDecoder é a forma padrão de guardar tipos personalizados em Data.
  • 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)")
    }
}