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).
-
Definicja struktury: Struktura musi spełniać protokół
Codable.struct MyData: Codable { let id: Int let name: String let isActive: Bool } -
Zapisywanie: Kodowanie struktury do
Dataza pomocąJSONEncoderi 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") } -
Odczyt: Odczyt
Dataz 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
CodableiJSONEncoder/JSONDecoderjest standardową metodą zapisywania niestandardowych typów wData. - 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)")
}
}