Junior
Πώς αποθηκεύετε και διαβάζετε δομές δεδομένων χρησιμοποιώντας το User Defaults;
sobes.tech AI
Απάντηση από AI
Οι προεπιλογές χρήστη αποθηκεύουν μόνο ένα περιορισμένο σύνολο τύπων: Data, String, Number, Date, Array, Dictionary. Για την αποθήκευση προσαρμοσμένων δομών δεδομένων, πρέπει να κωδικοποιηθούν σε Data και να αποκωδικοποιηθούν ξανά.
Χρησιμοποιείται το πρωτόκολλο Codable (συνδυασμός Encodable και Decodable).
-
Ορισμός δομής: Η δομή πρέπει να συμμορφώνεται με το πρωτόκολλο
Codable.struct MyData: Codable { let id: Int let name: String let isActive: Bool } -
Αποθήκευση: Κωδικοποίηση της δομής σε
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("Αποτυχία κωδικοποίησης της δομής") } -
Ανάγνωση: Ανάγνωση
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)")
}
}