Sobes.tech
Junior

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.