Junior
Jak uložit a načíst datovou strukturu pomocí User Defaults?
sobes.tech AI
Odpověď od AI
User Defaults ukládá pouze omezenou sadu typů: Data, String, Number, Date, Array, Dictionary. Pro ukládání vlastních datových struktur je třeba je zakódovat do Data a dekódovat zpět.
Používá se protokol Codable (kombinace Encodable a Decodable).
-
Definice struktury: Struktura musí odpovídat protokolu
Codable.struct MyData: Codable { let id: Int let name: String let isActive: Bool } -
Uložení: Kódování struktury do
DatapomocíJSONEncodera uložení do User Defaults.let myStruct = MyData(id: 1, name: "Example", isActive: true) // Kódování do Data let encoder = JSONEncoder() if let encodedData = try? encoder.encode(myStruct) { // Uložení Data pod klíčem UserDefaults.standard.set(encodedData, forKey: "myCustomData") } else { // Zpracování chyby kódování print("Failed to encode struct") } -
Čtení: Čtení
Dataz User Defaults a dekódování zpět do struktury pomocíJSONDecoder.// Získání Data podle klíče if let savedData = UserDefaults.standard.data(forKey: "myCustomData") { // Dekódování Data zpět do struktury let decoder = JSONDecoder() if let loadedStruct = try? decoder.decode(MyData.self, from: savedData) { // Použití načtené struktury print("Loaded struct: \(loadedStruct)") } else { // Zpracování chyby dekódování print("Failed to decode data") } } else { // Data pod klíčem nebyla nalezena print("No data found for key") }
Klíčové body:
- User Defaults není určen pro ukládání velkých objemů dat nebo důvěrných informací.
- Použití
CodableaJSONEncoder/JSONDecoderje standardní způsob ukládání vlastních typů doData. - Je nutné používat
try?a zpracovávat potenciální chyby při kódování/dekódování. - Pro ukládání polí struktur se také používá
Codable.
// Příklad uložení pole struktur
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říklad načtení pole struktur
if let savedArrayData = UserDefaults.standard.data(forKey: "myCustomArray") {
let decoder = JSONDecoder()
if let loadedArray = try? decoder.decode([MyData].self, from: savedArrayData) {
print("Loaded array: \(loadedArray)")
}
}