Sobes.tech
Junior

Hogyan tároljuk és olvassuk az adatszerkezeteket a User Defaults segítségével?

sobes.tech MI

Válasz az MI-től

A User Defaults csak korlátozott típusokat tárol: Data, String, Number, Date, Array, Dictionary. Egyedi adatszerkezetek tárolásához ezeket Data-vá kell kódolni, majd visszafejteni.

A használt protokoll a Codable (együttesen az Encodable és Decodable).

  1. Struktúra meghatározása: A struktúrának meg kell felelnie a Codable protokollnak.

    struct MyData: Codable {
        let id: Int
        let name: String
        let isActive: Bool
    }
    
  2. Mentés: A struktúra kódolása Data-vá JSONEncoder segítségével, majd mentése User Defaults-be.

    let myStruct = MyData(id: 1, name: "Example", isActive: true)
    
    // Kódolás Data-vá
    let encoder = JSONEncoder()
    if let encodedData = try? encoder.encode(myStruct) {
        // Data mentése kulccsal
        UserDefaults.standard.set(encodedData, forKey: "myCustomData")
    } else {
        // Hibakezelés kódolásnál
        print("Sikertelen struktúra kódolás")
    }
    
  3. Olvasás: Data olvasása User Defaults-ből, majd visszafejtése a struktúrává JSONDecoder segítségével.

    // Data lekérése kulccsal
    if let savedData = UserDefaults.standard.data(forKey: "myCustomData") {
        // Data dekódolása struktúrává
        let decoder = JSONDecoder()
        if let loadedStruct = try? decoder.decode(MyData.self, from: savedData) {
            // A betöltött struktúra használata
            print("Betöltött struktúra: \(loadedStruct)")
        } else {
            // Dekódolási hiba
            print("Data dekódolás sikertelen")
        }
    } else {
        // Nincs adat
        print("Nincs adat a kulcshoz")
    }
    

Kulcsfontosságú pontok:

  • A User Defaults nem alkalmas nagy mennyiségű adat vagy bizalmas információ tárolására.
  • A Codable és a JSONEncoder/JSONDecoder használata az alapértelmezett módszer a saját típusok Data-ba mentésére.
  • try?-t kell használni, és kezelni a lehetséges hibákat.
  • Tömbök struktúrák mentéséhez is a Codable használata szükséges.
// Példa tömb mentésére
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")
}

// Példa tömb olvasására
if let savedArrayData = UserDefaults.standard.data(forKey: "myCustomArray") {
    let decoder = JSONDecoder()
    if let loadedArray = try? decoder.decode([MyData].self, from: savedArrayData) {
        print("Betöltött tömb: \(loadedArray)")
    }
}