Расскажи о кодировании и декодировании данных в 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 может требоваться для поддержки старого кода.