Sobes.tech
Junior

Μίλησε για την κωδικοποίηση και αποκωδικοποίηση δεδομένων στο UserDefaults.

sobes.tech AI

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

Το UserDefaults αποθηκεύει δεδομένα σε μορφή κλειδιού-τιμής. Για προσαρμοσμένους τύπους δεδομένων που δεν υποστηρίζονται άμεσα (String, Int, Bool, Data, Array, Dictionary), απαιτείται κωδικοποίηση/αποκωδικοποίηση. Χρησιμοποιείται το πρωτόκολλο Codable, που συνδυάζει το Encodable και το Decodable.

Παράδειγμα κωδικοποίησης ενός προσαρμοσμένου τύπου:

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

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

Με PropertyListEncoder και PropertyListDecoder μπορούν να κωδικοποιηθούν/αποκωδικοποιηθούν αντικείμενα Codable σε Data για αποθήκευση στο UserDefaults.

Κωδικοποίηση:

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

Αποκωδικοποίηση:

if let savedData = UserDefaults.standard.data(forKey: "currentUser") {
    let decoder = PropertyListDecoder()
    if let loadedUser = try? decoder.decode(User.self, from: savedData) {
        print("Φόρτωση χρήστη: \(loadedUser.name), ηλικία: \(loadedUser.age)")
    }
}

Εναλλακτικός τρόπος (λιγότερο προτεινόμενος για νέα έργα): χρήση NSCoding με κληρονομικότητα από NSObject.

Σύγκριση μεθόδων:

Μέθοδος Πρωτόκολλο/Κλάση Υποστήριξη για Τύπους Αξίας/Αναφοράς Απαιτούμενες μέθοδοι Ευκολία
Codable Codable (Encodable, Decodable) Αξία & Αναφορά Αυτόματη υλοποίηση αν πληρούνται οι προϋποθέσεις Υψηλή
NSCoding NSCoding Αναφορά (απαιτεί NSObject) init(coder:), encode(with:) Μέτρια

Το Codable είναι η σύγχρονη και συστηνόμενη προσέγγιση λόγω της ευκολίας χρήσης και της αυτόματης σύνθεσης. Το NSCoding μπορεί να απαιτείται για την υποστήριξη παλαιού κώδικα.