Sobes.tech
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).

  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)")
    }
}