Назад к вопросам
Junior
81
questionbank
Как сохранять и считывать структуру данных с использованием User Defaults?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech 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)")
}
}