Ответ
Выбор хранилища зависит от объёма данных, структуры, требований к скорости и необходимости сохранения между запусками.
| Место хранения | Тип данных / Объём | Ключевой API | Когда использовать |
|---|---|---|---|
| Оперативная память (RAM) | Временные данные, кэш. | Переменные в классе (Array, Dictionary). |
Данные нужны только во время работы приложения. Самый быстрый доступ. |
| UserDefaults | Небольшие коллекции примитивов или Codable-объектов. |
UserDefaults.standard. |
Настройки пользователя, флаги, простые списки (< 100 КБ). |
| Файловая система (Documents/ Caches) | Любые данные среднего и большого размера. | FileManager, Codable + JSONEncoder/PropertyListEncoder. |
Коллекции объектов, которые нужно сохранять, но не требуют сложных запросов (например, сохранённые статьи, профили). |
| Базы данных (SQLite, Core Data, Realm) | Большие, структурированные коллекции со связями. | CoreData, GRDB, Realm. |
Данные с отношениями (пользователи + заказы), требующие сложных запросов, сортировки, фильтрации. |
| Ключевое хранилище (Keychain) | Чувствительные данные (пароли, токены). | Keychain Services. |
Маленькие защищённые коллекции (например, список access token). |
Пример для файловой системы (Codable):
struct Task: Codable {
let id: UUID
let title: String
}
// Сохранение массива задач
let tasks: [Task] = // ...
let url = FileManager.default
.urls(for: .documentDirectory, in: .userDomainMask)[0]
.appendingPathComponent("tasks.json")
let encoder = JSONEncoder()
do {
let data = try encoder.encode(tasks)
try data.write(to: url)
} catch {
print("Ошибка сохранения: (error)")
}
Рекомендация: Начинайте с простого решения (память → UserDefaults → файл). Переходите к базе данных при появлении требований к запросам или объёму.