Ответ
Выбор способа зависит от объёма, структуры и чувствительности данных.
| Способ | Назначение | Ключевые особенности |
|---|---|---|
UserDefaults |
Простые настройки, флаги, небольшие значения. | Простой API, хранит Property List (plist). Не для конфиденциальных или больших данных. |
| Keychain Services | Пароли, токены, криптографические ключи. | Безопасное хранилище на уровне системы. Используйте через Security.framework или обёртки (например, KeychainAccess). |
| Core Data | Сложные объектные графы с отношениями, локальная БД. | Объектно-графовый и persistence-фреймворк от Apple. Использует SQLite, XML, бинарный формат. |
| Realm | Альтернатива Core Data для сложных данных. | Собственный движок БД, часто быстрее Core Data, простой Swift/Obj-C API. |
| SQLite (прямой) | Полный контроль над SQL-запросами и схемой. | Лёгкая встраиваемая БД. Используйте библиотеки-обёртки: FMDB (Obj-C), GRDB.swift (Swift). |
| Файловая система | Изображения, документы, кэш, большие бинарные данные. | Используйте FileManager для работы с директориями (Documents, Library/Caches, tmp). |
Архивация (Codable/NSCoding) |
Сохранение кастомных объектов в файл или UserDefaults. |
Codable — современный Swift-способ сериализации в JSON/Property List. |
Практические примеры:
UserDefaults:
UserDefaults.standard.set(true, forKey: "isDarkModeEnabled")
let value = UserDefaults.standard.bool(forKey: "isDarkModeEnabled")
Сохранение в файл через Codable:
struct Settings: Codable { var theme: String }
let settings = Settings(theme: "dark")
let url = FileManager.default
.urls(for: .documentDirectory, in: .userDomainMask)[0]
.appendingPathComponent("settings.json")
let data = try JSONEncoder().encode(settings)
try data.write(to: url)