Даный пример кода реализует CLEAN архитектуру(как минимум частично, ибо код копипастился за пару часов на коленке, и час ушел на удаление корпоративных решений).
Первое что хотелось бы отметить - это решение проблемы большого и не гибкого AppDelegate. Для этого был создан класс AppServiceComposite(инстанс AppDelegate) в котором регистрируются инстансы типа AppService(appDelegate). В AppServiceComposite имплементируются все нужные методы AppDelegate и в этих методах комбайнятся зареганные сервисы, и для каждого сервиса выполняется унжный метод делегата. AppServiceComposite регистрируется в AppServiceAssembly и резолвается в init() методе AppDelegate при помощи MainAssembler. Таким образом при добавлении новых требований мы можем создавать новые сервисы и регать их AppServiceAssembly и вызывать их методы в appDelegate.
Все зависимости вынесены в DI часть, для каждой логической сущности используется свой Assembly и регистрируется в DI-ке. Связи между объектами завязаны на интерфейсах, а не на реализации. Это позволяет коду быть более гибким и поддержуемым.
Для байндингов используется RxSwift в тандеме ViewModel. Во ViewModel выделено два основных интерфейса: Input & Output, что позволяет инкапсулировать ненужную имплементацию и сделать взаимосвязь View и VeiwModel более понятной. (Сделано максимально криво, и я это понимаю, но времени выделил мало, потому "маємо шо маємо" :D )
Вьюконтроллеры регистрируются в DI, и резолваются при переходах по сегвеях, что упрощает навигацию в приложении (тут бы Router прикрутить)
В приложении есть пример тестов(масло масляное) с моками.
Используется SwiftLint с большим колличеством правил которые позволяют комманде девелоперов писать более читаемый код, придерживаясь общепринятых норм