Назад к вопросам
Junior
81
questionbank

Как сохранять и считывать структуру данных с использованием User Defaults?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech 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)")
    }
}