Junior
Как да запазим и прочетем структура на данни с помощта на User Defaults?
sobes.tech AI
Отговор от AI
User Defaults запазва само ограничен набор от типове: 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("Failed to encode struct") } -
Четене: Четене на
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("Loaded struct: \(loadedStruct)") } else { // Обработка на грешка при декодиране print("Failed to decode data") } } else { // Данните по ключ не са намерени print("No data found for key") }
Ключови моменти:
- 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("Loaded array: \(loadedArray)")
}
}