Sobes.tech
Junior

Jak zapisywać i odczytywać strukturę danych za pomocą User Defaults?

sobes.tech AI

Odpowiedź od AI

User Defaults przechowuje tylko ograniczony zestaw typów: Data, String, Number, Date, Array, Dictionary. Aby przechowywać niestandardowe struktury danych, należy je zakodować do Data i odkodować z powrotem.

Używany jest protokół Codable (połączenie Encodable i Decodable).

  1. Definicja struktury: Struktura musi spełniać protokół Codable.

    struct MyData: Codable {
        let id: Int
        let name: String
        let isActive: Bool
    }
    
  2. Zapisywanie: Kodowanie struktury do Data za pomocą JSONEncoder i zapis w User Defaults.

    let myStruct = MyData(id: 1, name: "Example", isActive: true)
    
    // Kodowanie do Data
    let encoder = JSONEncoder()
    if let encodedData = try? encoder.encode(myStruct) {
        // Zapis danych pod kluczem
        UserDefaults.standard.set(encodedData, forKey: "myCustomData")
    } else {
        // Obsługa błędu kodowania
        print("Nie udało się zakodować struktury")
    }
    
  3. Odczyt: Odczyt Data z User Defaults i dekodowanie z powrotem do struktury za pomocą JSONDecoder.

    // Pobranie danych po kluczu
    if let savedData = UserDefaults.standard.data(forKey: "myCustomData") {
        // Dekodowanie danych do struktury
        let decoder = JSONDecoder()
        if let loadedStruct = try? decoder.decode(MyData.self, from: savedData) {
            // Użycie załadowanej struktury
            print("Załadowana struktura: \(loadedStruct)")
        } else {
            // Obsługa błędu dekodowania
            print("Nie udało się zdekodować danych")
        }
    } else {
        // Dane nie znalezione
        print("Nie znaleziono danych dla klucza")
    }
    

Kluczowe punkty:

  • User Defaults nie jest przeznaczony do przechowywania dużych ilości danych lub poufnych informacji.
  • Użycie Codable i JSONEncoder/JSONDecoder jest standardową metodą zapisywania niestandardowych typów w Data.
  • Należy używać try? i obsługiwać potencjalne błędy kodowania/dekodowania.
  • Do przechowywania tablic struktur również używa się Codable.
// Przykład zapisywania tablicy struktur
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")
}

// Przykład odczytu tablicy struktur
if let savedArrayData = UserDefaults.standard.data(forKey: "myCustomArray") {
    let decoder = JSONDecoder()
    if let loadedArray = try? decoder.decode([MyData].self, from: savedArrayData) {
        print("Załadowana tablica: \(loadedArray)")
    }
}