Junior
Kako sačuvati i čitati strukturu podataka koristeći User Defaults?
sobes.tech АИ
Одговор од АИ
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)")
}
}