Что такое UserDefaults? Для чего они используются?ios-99

Что такое UserDefaults?

UserDefaults — это легковесное key-value хранилище данных, предоставляемое iOS SDK. Это система сохранения простых типов данных между запусками приложения.

// Базовый пример использования
let defaults = UserDefaults.standard
defaults.set(42, forKey: "userAge")
let age = defaults.integer(forKey: "userAge")

Как работает UserDefaults?

  1. Интерфейс: Работает как словарь (ключ-значение)
  2. Хранение: Данные сохраняются в plist-файле в sandbox приложения
  3. Жизненный цикл: Данные сохраняются между запусками приложения, но удаляются при его удалении

Основные сценарии использования

  1. Хранение настроек пользователя:

    defaults.set(true, forKey: "darkModeEnabled")
    
  2. Кэширование простых данных:

    defaults.set(lastUpdateDate, forKey: "lastCacheUpdate")
    
  3. Хранение состояния приложения:

    defaults.set(false, forKey: "onboardingShown")
    
  4. Флаги функциональности:

    defaults.set("v2", forKey: "activeFeatureSet")
    

Поддерживаемые типы данных

Тип данныхМетод записиМетод чтения
Int .set(42, forKey:) .integer(forKey:)
Double .set(3.14, forKey:) .double(forKey:)
Bool .set(true, forKey:) .bool(forKey:)
String .set("text", forKey:) .string(forKey:)
Data .set(data, forKey:) .data(forKey:)
Array .set([1,2], forKey:) .array(forKey:)
Dictionary .set(["k":"v"], forKey:) .dictionary(forKey:)
URL .set(url, forKey:) .url(forKey:)

Продвинутые возможности

  1. Синхронизация:

    defaults.synchronize() // Явная синхронизация (не требуется в современных версиях iOS)
    
  2. Suite Names (для App Groups):

    let sharedDefaults = UserDefaults(suiteName: "group.com.yourapp")!
    
  3. Наблюдение за изменениями:

    NotificationCenter.default.addObserver(
        forName: UserDefaults.didChangeNotification,
        object: nil,
        queue: nil) { _ in
        // Реакция на изменения
    }
    

Ограничения и лучшие практики

  1. Не используйте для:

    • Чувствительных данных (используйте Keychain)
    • Больших объемов данных (более 100KB)
    • Сложных структур (используйте Core Data/Realm)
  2. Лучшие практики:

    • Используйте enum для ключей:
      enum DefaultsKeys {
          static let userToken = "userToken"
      }
      
    • Удаляйте неиспользуемые ключи:
      defaults.removeObject(forKey: "oldKey")
      
    • Проверяйте существование значения:
      if defaults.object(forKey: "someKey") != nil {
          // Значение существует
      }
      

Пример: Безопасная обертка для UserDefaults

@propertyWrapper
struct UserDefault<T> {
    let key: String
    let defaultValue: T

    var wrappedValue: T {
        get {
            UserDefaults.standard.object(forKey: key) as? T ?? defaultValue
        }
        set {
            UserDefaults.standard.set(newValue, forKey: key)
        }
    }
}

// Использование
@UserDefault(key: "darkModeEnabled", defaultValue: false)
static var isDarkModeEnabled: Bool

Резюмируем

  1. UserDefaults — это простое key-value хранилище для небольших объемов данных
  2. Основные применения:
    • Настройки пользователя
    • Кэширование простых данных
    • Состояние приложения
  3. Преимущества:
    • Простой API
    • Автоматическое сохранение
    • Поддержка основных типов данных
  4. Ограничения:
    • Не для чувствительных/больших данных
    • Нет сложных запросов
  5. Рекомендации:
    • Используйте обертки для безопасности
    • Организуйте ключи через enum
    • Удаляйте неиспользуемые данные

UserDefaults — идеальное решение для хранения простых пользовательских предпочтений и легковесных данных приложения.