UserDefaults хранит данные в формате пар ключ-значение. Для пользовательских типов данных, не поддерживаемых напрямую (String, Int, Bool, Data, Array, Dictionary), требуется кодирование/декодирование. Используется протокол Codable, который объединяет Encodable и Decodable.
Пример кодирования пользовательского типа:
swift
С помощью PropertyListEncoder и PropertyListDecoder можно кодировать/декодировать объекты Codable в Data для хранения в UserDefaults.
Кодирование:
swift
Декодирование:
swift
Альтернативный способ (менее предпочтительный для новых проектов): использование NSCoding с наследованием от NSObject.
Сравнение методов:
| Метод | Протокол/Класс | Поддержка Value/Reference Types | Требуемые методы | Простота |
|---|---|---|---|---|
Codable | Codable (Encodable, Decodable) | Value & Reference | Автоматическая реализация при соблюдении условий | Высокая |
NSCoding | NSCoding | Reference (требует NSObject) | init(coder:), encode(with:) | Средняя |
Codable является современным и рекомендуемым подходом благодаря простоте использования и автоматической синтезируемости. NSCoding может требоваться для поддержки старого кода.