Где в iOS-приложении можно хранить коллекцию данных?

«Где в iOS-приложении можно хранить коллекцию данных?» — вопрос из категории Управление памятью, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Выбор хранилища зависит от объёма данных, структуры, требований к скорости и необходимости сохранения между запусками.

Место хранения Тип данных / Объём Ключевой 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 → файл). Переходите к базе данных при появлении требований к запросам или объёму.