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).
-
Strukturdefinition: Die Struktur muss dem
Codable-Protokoll entsprechen.struct MyData: Codable { let id: Int let name: String let isActive: Bool } -
Speichern: Codieren der Struktur in
DatamitJSONEncoderund 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") } -
Lesen: Lesen von
Dataaus User Defaults und Decodieren zurück in die Struktur mitJSONDecoder.// 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
CodableundJSONEncoder/JSONDecoderist die Standardmethode, um benutzerdefinierte Typen inDatazu speichern. - Es sollte
try?verwendet und potenzielle Fehler beim Codieren/Decodieren behandelt werden. - Für das Speichern von Arrays von Strukturen wird ebenfalls
Codableverwendet.
// 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)")
}
}