Opowiedz o kodowaniu i dekodowaniu danych w UserDefaults.
sobes.tech AI
Odpowiedź od AI
UserDefaults przechowuje dane w formacie klucz-wartość. Dla niestandardowych typów danych, które nie są obsługiwane bezpośrednio (String, Int, Bool, Data, Array, Dictionary), konieczne jest kodowanie/dekodowanie. Używa się protokołu Codable, który łączy Encodable i Decodable.
Przykład kodowania niestandardowego typu:
struct User: Codable {
let name: String
let age: Int
}
let user = User(name: "Иван", age: 30)
Za pomocą PropertyListEncoder i PropertyListDecoder można kodować/dekodować obiekty Codable do Data do przechowywania w UserDefaults.
Kodowanie:
let encoder = PropertyListEncoder()
if let encoded = try? encoder.encode(user) {
UserDefaults.standard.set(encoded, forKey: "currentUser")
}
Dekodowanie:
if let savedData = UserDefaults.standard.data(forKey: "currentUser") {
let decoder = PropertyListDecoder()
if let loadedUser = try? decoder.decode(User.self, from: savedData) {
print("Załadowany użytkownik: \(loadedUser.name), wiek: \(loadedUser.age)")
}
}
Alternatywa (mniej zalecana dla nowych projektów): użycie NSCoding z dziedziczeniem od NSObject.
Porównanie metod:
| Metoda | Protokół/Klasa | Obsługa typów wartości/ruchomych | Wymagane metody | Łatwość |
|---|---|---|---|---|
Codable |
Codable (Encodable, Decodable) |
Wartości i referencje | Automatyczna implementacja przy spełnieniu warunków | Wysoka |
NSCoding |
NSCoding |
Referencje (wymaga NSObject) |
init(coder:), encode(with:) |
Średnia |
Codable jest nowoczesnym i zalecanym podejściem ze względu na prostotę użycia i automatyczną syntezę. NSCoding może być potrzebny do obsługi starszego kodu.