Как сохранять и читать данные с помощью UserDefaults в iOS?

Ответ

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"). Это как общий сейф.
  • И главное, ёпта: данные НЕ шифруются! Любой, кто докопается до телефона, сможет их прочитать. Не храни там пароли, пиздец! Это как оставить записку на холодильнике — все увидят.

Вот и вся магия. Просто, но с подводными еблями.