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

«Как сохранять и читать данные с помощью UserDefaults в iOS?» — вопрос из категории Базы данных, который задают на 10% собеседований 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 не шифруются и могут быть легко извлечены с устройства.