Этот вопрос проверяет понимание направленности зависимостей и роли абстракций в архитектуре.
Singleton нарушает Dependency Inversion, потому что код напрямую зависит от конкретной реализации. Вместо зависимости от абстракции используется жёсткая ссылка на shared. Это связывает высокоуровневые модули с деталями реализации. В результате становится сложно менять реализацию и писать тесты. Зависимость становится глобальной и неявной.
Нарушение DIP в Singleton связано с его глобальной доступностью.
Когда используется Singleton:
зависимость создаётся внутри класса
абстракции отсутствуют
направление зависимости невозможно изменить
class UserViewModel {
func load() {
AnalyticsManager.shared.track(event: "open")
}
}
UserViewModel напрямую зависит от конкретной реализации.
Dependency Inversion требует:
Зависеть от протоколов
Получать зависимости извне
Изолировать детали реализации
Singleton нарушает все три пункта.
сложное unit-тестирование
невозможность замены реализации
скрытые зависимости
Singleton жёстко связывает код и тем самым нарушает DIP. Это одна из основных причин, по которой его стараются избегать в современной iOS-архитектуре.