Pull to refresh

Comments 10

Хороший вопрос. Если вы хотите сказать что это именно nil и ничего больше — используйте Void. Но этот тип не подходит для контейнеров (в тот же UINavigationController) так как в них может быть встроен вью контроллер которому потребуется некий отличный от nil объект и рутер не сможет построить цепочку так как контейнер будет четко указывать роутеру что он может быть построен исключительно с nil и все его внутренние вью контроллеры в том числе.


Any? является универсальным, сообщая роутеру что он может игнорировать в данном конкретном случае проверку типов. Но для вашего конечного вью контроллера вы можете использовать Void

Я как раз про конечные контроллеры. Мне показалось, что неопциональный Void семантически подходит лучше. Естественный синглтон, не несущий никакой смысловой нагрузки, то что доктор прописал.

Тут все совершенно верно. Но в наших приложениях всегда присутствует некий контекст который содержит в себе помимо данных для построения вью контролера (или отсутствия таковых) обязательные поля для аналитики которые продиктованы протоколами. Какие то должны быть заполнены в ручную, какие то заполняется делегатами того же `UINavigationController`-а, что бы отслеживать перемещение пользователя в приложении (в том числе когда он делает тот же свайп бэк) и потом все это автоматически (и не очень) сабмитится в аналитику, поэтому если мы хотим сказать что там точно что то будет и кто то это будет обрабатывать, но самому вью контролеру все равно — мы используем Any?.. Пожалуй, в качестве абстрактного примера и правда стоит отметить в статье, что при желании можно использовать Void

Но, кстати, щас подумал — Void наложит еще одно ограничение.


Допустим у вас конфиграция (образно):


UINavigationContoller<Any?> -> ProductListViewController<Void> -> ProdictViewContoller<String>

И допустим пришла вам универсальная ссылка с айди продукта и вы хотите построить именно в такой конфигурации. Роутер не обработает такую конфигурацию со стрингом в контексте, потому что ProductListViewController говорит что ему что бы быть построенным контекст должен быть nil и точка. В случае же с Any? такая цепочка будет валидной так как ProductListViewController в общем то все равно что там может быть передано для предыдущих и последующих вью контроллеров. Он явно указывает на это роутеру.

Получается, что Void будет работать только на тупиковых экранах, с которых никуда вообще нельзя попасть и которые не зависят от входных данных сами. Под такое описание подойдёт, разве что, Terms and Conditions или что-то в таком духе.

Грубо говоря да. Или в связке где все экраны хотят nil и ни в коем случае что то иное. Наверное, такое тоже имеет место быть.


Тут следует еще уточнить логику работы роутера, мне не хотелось вдаваться в подробности в статье.


Роутер раскручивает конфигурацию назад пока не дойдет до конца или не встретит вью контроллер который уже построен (ну и проверит что все предыдущие контроллеры присутствуют как надо), после этого будет двигаться по конфигурации вперед и строить недостающие. В том же навигейшен стеке может быть любое количество вью контроллеров с разными контекстами или без них. Просто нельзя сконфигурировать за раз такой навигейшен контроллер с нуля с заполненым стеком.

Точнее можно, но тогда роутер не сможет вам гарантировать никакого привидения типов. Придется взеде сказать что это Any? и в фабриках проверять тип вручную, или использовать Dictionary контекст и бросать эксепшен если в нем не хватает чего то что нужно одному из вью контроллеров в цепочке.


Но, в нашей практике даже близко таких запросов не возникало. Обычно требуется один, максимум два контроллерва в стеке построить за раз. Но, как видно из примера выше, подход достаточно гибкий и если такой запрос встретиться — его можно реализовать.

Sign up to leave a comment.

Articles