Назад к вопросам
Junior
82
questionbank

Расскажи о кодировании и декодировании данных в UserDefaults.

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

UserDefaults хранит данные в формате пар ключ-значение. Для пользовательских типов данных, не поддерживаемых напрямую (String, Int, Bool, Data, Array, Dictionary), требуется кодирование/декодирование. Используется протокол Codable, который объединяет Encodable и Decodable.

Пример кодирования пользовательского типа:

struct User: Codable {
    let name: String
    let age: Int
}

let user = User(name: "Иван", age: 30)

С помощью PropertyListEncoder и PropertyListDecoder можно кодировать/декодировать объекты Codable в Data для хранения в UserDefaults.

Кодирование:

let encoder = PropertyListEncoder()
if let encoded = try? encoder.encode(user) {
    UserDefaults.standard.set(encoded, forKey: "currentUser")
}

Декодирование:

if let savedData = UserDefaults.standard.data(forKey: "currentUser") {
    let decoder = PropertyListDecoder()
    if let loadedUser = try? decoder.decode(User.self, from: savedData) {
        print("Загруженный пользователь: \(loadedUser.name), возраст: \(loadedUser.age)")
    }
}

Альтернативный способ (менее предпочтительный для новых проектов): использование NSCoding с наследованием от NSObject.

Сравнение методов:

Метод Протокол/Класс Поддержка Value/Reference Types Требуемые методы Простота
Codable Codable (Encodable, Decodable) Value & Reference Автоматическая реализация при соблюдении условий Высокая
NSCoding NSCoding Reference (требует NSObject) init(coder:), encode(with:) Средняя

Codable является современным и рекомендуемым подходом благодаря простоте использования и автоматической синтезируемости. NSCoding может требоваться для поддержки старого кода.