Sobes.tech
Junior

Wie speichert und liest man eine Datenstruktur mit User Defaults?

sobes.tech KI

Antwort von AI

User Defaults speichert nur eine begrenzte Anzahl von Typen: Data, String, Number, Date, Array, Dictionary. Für die Speicherung benutzerdefinierter Datenstrukturen müssen diese in Data codiert und wieder decodiert werden.

Das verwendete Protokoll ist Codable (eine Kombination aus Encodable und Decodable).

  1. Strukturdefinition: Die Struktur muss dem Codable-Protokoll entsprechen.

    struct MyData: Codable {
        let id: Int
        let name: String
        let isActive: Bool
    }
    
  2. Speichern: Codieren der Struktur in Data mit JSONEncoder und Speichern in User Defaults.

    let myStruct = MyData(id: 1, name: "Example", isActive: true)
    
    // In Data codieren
    let encoder = JSONEncoder()
    if let encodedData = try? encoder.encode(myStruct) {
        // Data unter Schlüssel speichern
        UserDefaults.standard.set(encodedData, forKey: "myCustomData")
    } else {
        // Fehlerbehandlung beim Codieren
        print("Fehler beim Codieren der Struktur")
    }
    
  3. Lesen: Lesen von Data aus User Defaults und Decodieren zurück in die Struktur mit JSONDecoder.

    // Data unter Schlüssel abrufen
    if let savedData = UserDefaults.standard.data(forKey: "myCustomData") {
        // Data in Struktur decodieren
        let decoder = JSONDecoder()
        if let loadedStruct = try? decoder.decode(MyData.self, from: savedData) {
            // Verwendung der geladenen Struktur
            print("Geladene Struktur: \(loadedStruct)")
        } else {
            // Fehler beim Decodieren
            print("Fehler beim Decodieren der Daten")
        }
    } else {
        // Keine Daten gefunden
        print("Keine Daten für den Schlüssel gefunden")
    }
    

Wichtige Punkte:

  • User Defaults ist nicht für die Speicherung großer Datenmengen oder vertraulicher Informationen gedacht.
  • Die Verwendung von Codable und JSONEncoder/JSONDecoder ist die Standardmethode, um benutzerdefinierte Typen in Data zu speichern.
  • Es sollte try? verwendet und potenzielle Fehler beim Codieren/Decodieren behandelt werden.
  • Für das Speichern von Arrays von Strukturen wird ebenfalls Codable verwendet.
// Beispiel zum Speichern eines Arrays von Strukturen
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")
}

// Beispiel zum Lesen eines Arrays von Strukturen
if let savedArrayData = UserDefaults.standard.data(forKey: "myCustomArray") {
    let decoder = JSONDecoder()
    if let loadedArray = try? decoder.decode([MyData].self, from: savedArrayData) {
        print("Geladenes Array: \(loadedArray)")
    }
}