В чем разница между хранением данных в файлах и UserDefaults
Что проверяют
Понимаете ли вы, что UserDefaults это хранилище настроек, а не база данных, и умеете ли выбрать место под конкретные данные. Следом часто спрашивают, куда положить токен авторизации и где держать кеш картинок.
Как отвечать
UserDefaults: ключ-значение поверх plist вLibrary/Preferences. Принимает типы property list:String, числа,Bool,Date,Data, массивы и словари из них. Модель можно закодировать черезCodableвData, но это уже сигнал, что место выбрано не то. Файл целиком загружается в память процесса, поэтому держат там мелочь: флаги, тему, дату последнего запуска. В SwiftUI поверх него работает@AppStorage, с виджетами и расширениями данные делят черезUserDefaults(suiteName:)и App Group;- файлы:
FileManagerиData.write(to:options:), любые объёмы и форматы, от JSON до видео. Важно, в какую папку писать:Documentsдля того, что создал пользователь,Application Supportдля внутренних данных,Cachesдля того, что можно скачать заново. Кеш система вправе очистить при нехватке места, в бэкап он не попадает; - защита: файлу задают класс Data Protection, например
.completeFileProtectionпри записи. Секреты не кладут ни в файлы, ни вUserDefaults, для них есть Keychain.
Хорошо добавить, что для структурированных данных с выборками и связями берут SwiftData, Core Data или SQLite. И что UserDefaults входит в список API с обязательным обоснованием: причину нужно указать в PrivacyInfo.xcprivacy, иначе App Store Connect не примет сборку.
Где спотыкаются
Хранят в UserDefaults токены и пароли. Это обычный plist в песочнице, он попадает в резервные копии и легко читается на устройстве с джейлбрейком.
Складывают туда массивы моделей или картинки в Data. Всё это грузится в память при первом обращении и тормозит запуск.
Вызывают synchronize() после каждой записи. Apple прямо пишет, что метод не нужен: система сама сбрасывает изменения на диск. Из той же серии: крупные файлы читают и пишут на главном потоке, и интерфейс подвисает.