Sobes.tech
Junior

Как да запазим и прочетем структура на данни с помощта на User Defaults?

sobes.tech AI

Отговор от AI

User Defaults запазва само ограничен набор от типове: Data, String, Number, Date, Array, Dictionary. За съхраняване на потребителски структури данни те трябва да бъдат кодирани в Data и декодирани обратно.

Използва се протоколът Codable (комбинация от Encodable и Decodable).

  1. Дефиниране на структура: Структурата трябва да съответства на протокола Codable.

    struct MyData: Codable {
        let id: Int
        let name: String
        let isActive: Bool
    }
    
  2. Запазване: Кодиране на структурата в 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")
    }
    
  3. Четене: Четене на 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)")
    }
}