Sobes.tech
Junior

Πώς αποθηκεύετε και διαβάζετε δομές δεδομένων χρησιμοποιώντας το User Defaults;

sobes.tech AI

Απάντηση από AI

Οι προεπιλογές χρήστη αποθηκεύουν μόνο ένα περιορισμένο σύνολο τύπων: Data, String, Number, Date, Array, Dictionary. Για την αποθήκευση προσαρμοσμένων δομών δεδομένων, πρέπει να κωδικοποιηθούν σε Data και να αποκωδικοποιηθούν ξανά.

Χρησιμοποιείται το πρωτόκολλο Codable (συνδυασμός Encodable και Decodable).

  1. Ορισμός δομής: Η δομή πρέπει να συμμορφώνεται με το πρωτόκολλο Codable.

    struct MyData: Codable {
        let id: Int
        let name: String
        let isActive: Bool
    }
    
  2. Αποθήκευση: Κωδικοποίηση της δομής σε Data με JSONEncoder και αποθήκευσή της στα User Defaults.

    let myStruct = MyData(id: 1, name: "Example", isActive: true)
    
    // Κωδικοποίηση σε Data
    let encoder = JSONEncoder()
    if let encodedData = try? encoder.encode(myStruct) {
        // Αποθήκευση Data με το κλειδί
        UserDefaults.standard.set(encodedData, forKey: "myCustomData")
    } else {
        // Διαχείριση σφάλματος κωδικοποίησης
        print("Αποτυχία κωδικοποίησης της δομής")
    }
    
  3. Ανάγνωση: Ανάγνωση Data από τα User Defaults και αποκωδικοποίηση πίσω στη δομή με JSONDecoder.

    // Ανάκτηση Data με το κλειδί
    if let savedData = UserDefaults.standard.data(forKey: "myCustomData") {
        // Αποκωδικοποίηση Data σε δομή
        let decoder = JSONDecoder()
        if let loadedStruct = try? decoder.decode(MyData.self, from: savedData) {
            // Χρήση της φορτωμένης δομής
            print("Φορτωμένη δομή: \(loadedStruct)")
        } else {
            // Σφάλμα αποκωδικοποίησης
            print("Αποτυχία αποκωδικοποίησης δεδομένων")
        }
    } else {
        // Δεν βρέθηκαν δεδομένα
        print("Δεν βρέθηκαν δεδομένα για το κλειδί")
    }
    

Βασικά σημεία:

  • Τα User Defaults δεν προορίζονται για την αποθήκευση μεγάλων όγκων δεδομένων ή εμπιστευτικών πληροφοριών.
  • Η χρήση του Codable και JSONEncoder/JSONDecoder είναι ο τυπικός τρόπος αποθήκευσης προσαρμοσμένων τύπων σε Data.
  • Πρέπει να χρησιμοποιείται try? και να διαχειρίζονται τυχόν σφάλματα κωδικοποίησης/αποκωδικοποίησης.
  • Για την αποθήκευση πινάκων δομών, επίσης χρησιμοποιείται το Codable.
// Παράδειγμα αποθήκευσης πίνακα δομών
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")
}

// Παράδειγμα ανάγνωσης πίνακα δομών
if let savedArrayData = UserDefaults.standard.data(forKey: "myCustomArray") {
    let decoder = JSONDecoder()
    if let loadedArray = try? decoder.decode([MyData].self, from: savedArrayData) {
        print("Φορτωμένος πίνακας: \(loadedArray)")
    }
}