Ответ
UserDefaults — это легковесное хранилище типа «ключ-значение» для сохранения небольших объемов данных (настроек, флагов, простых объектов).
Базовые операции:
-
Запись данных:
let defaults = UserDefaults.standard defaults.set("Алексей", forKey: "userName") defaults.set(42, forKey: "userScore") defaults.set(true, forKey: "isOnboardingCompleted") // Начиная с iOS 12, вызов `synchronize()` не требуется. -
Чтение данных:
let name = defaults.string(forKey: "userName") // String? let score = defaults.integer(forKey: "userScore") // Int let isCompleted = defaults.bool(forKey: "isOnboardingCompleted") // Bool
Работа с Codable-объектами:
Для сохранения пользовательских типов данных используйте JSONEncoder/JSONDecoder.
struct UserSettings: Codable {
var theme: String
var notificationsEnabled: Bool
}
let settings = UserSettings(theme: "dark", notificationsEnabled: true)
// Сохранение
if let encoded = try? JSONEncoder().encode(settings) {
defaults.set(encoded, forKey: "userSettings")
}
// Чтение
if let data = defaults.data(forKey: "userSettings"),
let decoded = try? JSONDecoder().decode(UserSettings.self, from: data) {
print(decoded.theme)
}
Важные ограничения и best practices:
- Не храните большие данные (изображения, модели) — для этого используйте FileManager, Core Data или Realm.
- Удаление:
defaults.removeObject(forKey: "userName") - Группы приложений: Для обмена данными между приложением и расширениями используйте
UserDefaults(suiteName: "group.com.your.app"). - Данные
UserDefaultsне шифруются и могут быть легко извлечены с устройства.
Ответ 18+ 🔞
Ха, ну ты и подсунул темку, про этот UserDefaults! Это ж как та старая тумбочка в прихожей, куда всё скидываешь: ключи, мелочь, а потом хуй найдёшь что-нибудь. В общем, слушай сюда, разберём по полочкам, без паники.
Это, блядь, такая штука, чтоб по-быстрому сохранить какую-нибудь хуйню: имя пользователя, его счёт в игре или флажок, что он уже посмотрел это ёбанное онбординг-видео. Лёгкое хранилище «ключ-значение», как записная книжка для дебилов — открыл, написал, закрыл.
Базовые телодвижения:
-
Записать что-то:
let defaults = UserDefaults.standard // Это наш главный чулан defaults.set("Василий", forKey: "userName") // Положил имя defaults.set(100500, forKey: "userScore") // Положил счёт defaults.set(true, forKey: "isOnboardingCompleted") // Положил факт, что онбординг просран // С iOS 12 можно не дрочиться с `synchronize()`, оно само сохранится. Расслабься. -
Достать обратно:
let name = defaults.string(forKey: "userName") // Достанешь String? — может быть, а может и хуй. let score = defaults.integer(forKey: "userScore") // Int, если ничего нет — вернёт 0, имей в виду! let isCompleted = defaults.bool(forKey: "isOnboardingCompleted") // Bool, по умолчанию false.
А если у меня своя, сложная, ебаная структура?
Ну, тут придётся немного потанцевать с Codable. Представь, что ты упаковываешь хрупкую хуйню в коробку.
struct UserSettings: Codable {
var theme: String
var notificationsEnabled: Bool
}
let settings = UserSettings(theme: "dark", notificationsEnabled: true) // Наш объект
// Упаковываем и засовываем в чулан
if let encoded = try? JSONEncoder().encode(settings) {
defaults.set(encoded, forKey: "userSettings")
}
// Достаём и распаковываем
if let data = defaults.data(forKey: "userSettings"),
let decoded = try? JSONDecoder().decode(UserSettings.self, from: data) {
print(decoded.theme) // Ура, "dark"!
}
А теперь, блядь, важные предупреждения, чтоб не обосраться:
- НЕ ТЫКАЙ ТУДА что попало! Картинки, огромные модели — это пиздец, а не использование. Для этого есть
FileManager,Core Data. Это тумбочка для мелочёвки, а не гараж для хлама! - Удалить:
defaults.removeObject(forKey: "userName")— выкинул ключи нахуй из тумбочки. - Для расширений: Если твоё приложение и его расширения (виджеты там) хотят шарить данные, используй
UserDefaults(suiteName: "group.com.your.app"). Это как общий сейф. - И главное, ёпта: данные НЕ шифруются! Любой, кто докопается до телефона, сможет их прочитать. Не храни там пароли, пиздец! Это как оставить записку на холодильнике — все увидят.
Вот и вся магия. Просто, но с подводными еблями.