Какие основные способы хранения данных в iOS?

Ответ

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

Способ Назначение Ключевые особенности
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)

Ответ 18+ 🔞

Ну, слушай, смотри, тут такая хуйня: выбор способа — это как выбрать, куда спрятать свою бутылку. В носки, в бачок унитаза или в сейф, блядь. Всё зависит от того, что прячешь, насколько это ценно и как часто будешь доставать.

Вот тебе таблица, чтобы не пиздеть попусту:

Способ Назначение Ключевые особенности
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")

Вот, смотри, это как записку на холодильник магнитиком прилепить. Быстро, просто, но любой, кто заглянет в твой plist-файл, её прочитает. Пароли туда не суй, ёпта!

Сохранение в файл через 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)

А это уже посерьёзнее. Упаковал свою структуру в JSON и запихнул в Documents. Как будто засунул пачку денег в банковскую ячейку, а не в носки. Уже лучше, блядь. Главное, путь (url) не потеряй, а то потом будешь как Герасим, «Му-му» говорить, а файла-то и нет.