Junior
Hogyan tároljuk és olvassuk az adatszerkezeteket a User Defaults segítségével?
sobes.tech MI
Válasz az MI-től
A User Defaults csak korlátozott típusokat tárol: Data, String, Number, Date, Array, Dictionary. Egyedi adatszerkezetek tárolásához ezeket Data-vá kell kódolni, majd visszafejteni.
A használt protokoll a Codable (együttesen az Encodable és Decodable).
-
Struktúra meghatározása: A struktúrának meg kell felelnie a
Codableprotokollnak.struct MyData: Codable { let id: Int let name: String let isActive: Bool } -
Mentés: A struktúra kódolása
Data-váJSONEncodersegítségével, majd mentése User Defaults-be.let myStruct = MyData(id: 1, name: "Example", isActive: true) // Kódolás Data-vá let encoder = JSONEncoder() if let encodedData = try? encoder.encode(myStruct) { // Data mentése kulccsal UserDefaults.standard.set(encodedData, forKey: "myCustomData") } else { // Hibakezelés kódolásnál print("Sikertelen struktúra kódolás") } -
Olvasás: Data olvasása User Defaults-ből, majd visszafejtése a struktúrává
JSONDecodersegítségével.// Data lekérése kulccsal if let savedData = UserDefaults.standard.data(forKey: "myCustomData") { // Data dekódolása struktúrává let decoder = JSONDecoder() if let loadedStruct = try? decoder.decode(MyData.self, from: savedData) { // A betöltött struktúra használata print("Betöltött struktúra: \(loadedStruct)") } else { // Dekódolási hiba print("Data dekódolás sikertelen") } } else { // Nincs adat print("Nincs adat a kulcshoz") }
Kulcsfontosságú pontok:
- A User Defaults nem alkalmas nagy mennyiségű adat vagy bizalmas információ tárolására.
- A
Codableés aJSONEncoder/JSONDecoderhasználata az alapértelmezett módszer a saját típusokData-ba mentésére. try?-t kell használni, és kezelni a lehetséges hibákat.- Tömbök struktúrák mentéséhez is a
Codablehasználata szükséges.
// Példa tömb mentésére
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")
}
// Példa tömb olvasására
if let savedArrayData = UserDefaults.standard.data(forKey: "myCustomArray") {
let decoder = JSONDecoder()
if let loadedArray = try? decoder.decode([MyData].self, from: savedArrayData) {
print("Betöltött tömb: \(loadedArray)")
}
}