Sobes.tech
Junior

Erzählen Sie von der Kodierung und Dekodierung von Daten in UserDefaults.

sobes.tech KI

Antwort von AI

UserDefaults speichert Daten im Schlüssel-Wert-Format. Für benutzerdefinierte Datentypen, die nicht direkt unterstützt werden (String, Int, Bool, Data, Array, Dictionary), sind Codierung/Decodierung erforderlich. Es wird das Codable-Protokoll verwendet, das Encodable und Decodable kombiniert.

Beispiel für die Codierung eines benutzerdefinierten Typs:

struct User: Codable {
    let name: String
    let age: Int
}

let user = User(name: "Иван", age: 30)

Mit PropertyListEncoder und PropertyListDecoder können Codable-Objekte in Data codiert/decodiert werden, um sie in UserDefaults zu speichern.

Codierung:

let encoder = PropertyListEncoder()
if let encoded = try? encoder.encode(user) {
    UserDefaults.standard.set(encoded, forKey: "currentUser")
}

Decodierung:

if let savedData = UserDefaults.standard.data(forKey: "currentUser") {
    let decoder = PropertyListDecoder()
    if let loadedUser = try? decoder.decode(User.self, from: savedData) {
        print("Geladener Benutzer: \(loadedUser.name), Alter: \(loadedUser.age)")
    }
}

Alternativ (weniger empfehlenswert für neue Projekte): Verwendung von NSCoding mit Vererbung von NSObject.

Vergleich der Methoden:

Methode Protokoll/Klasse Unterstützung für Value/Reference Types Erforderliche Methoden Einfachheit
Codable Codable (Encodable, Decodable) Value & Reference Automatische Implementierung bei Erfüllung der Bedingungen Hoch
NSCoding NSCoding Reference (benötigt NSObject) init(coder:), encode(with:) Mittel

Codable ist der moderne und empfohlene Ansatz aufgrund seiner Einfachheit und automatischen Synthese. NSCoding kann für die Unterstützung älteren Codes erforderlich sein.