Некоторые рекомендации я нахожу излишними для массмаркета. Разве что для банк клиента. Ну какой пин при запуске? Все пользователей енгеджат всеми силами, а вы предлагаете им пин вводить при запуске.
Но в целом — хорошая обзорная статья которую хорошо иметь под рукой.
Спасибо
Хочу сказать спасибо за AppCode, это самые продуктивные 6 евро которые я трачу в месяц. Если бы вы еще добавили возможность принудительной переиндексации проекта — было бы здорово. У нас большой проект состоящий из нескольких фреймворков и очень часто возникает ситуация, что, после нескольких переключений бранчей в гит, индексация проекта слетает и приходится закрывать и открывать AppCode снова.
Точнее можно, но тогда роутер не сможет вам гарантировать никакого привидения типов. Придется взеде сказать что это Any? и в фабриках проверять тип вручную, или использовать Dictionary контекст и бросать эксепшен если в нем не хватает чего то что нужно одному из вью контроллеров в цепочке.
Но, в нашей практике даже близко таких запросов не возникало. Обычно требуется один, максимум два контроллерва в стеке построить за раз. Но, как видно из примера выше, подход достаточно гибкий и если такой запрос встретиться — его можно реализовать.
Грубо говоря да. Или в связке где все экраны хотят nil и ни в коем случае что то иное. Наверное, такое тоже имеет место быть.
Тут следует еще уточнить логику работы роутера, мне не хотелось вдаваться в подробности в статье.
Роутер раскручивает конфигурацию назад пока не дойдет до конца или не встретит вью контроллер который уже построен (ну и проверит что все предыдущие контроллеры присутствуют как надо), после этого будет двигаться по конфигурации вперед и строить недостающие. В том же навигейшен стеке может быть любое количество вью контроллеров с разными контекстами или без них. Просто нельзя сконфигурировать за раз такой навигейшен контроллер с нуля с заполненым стеком.
И допустим пришла вам универсальная ссылка с айди продукта и вы хотите построить именно в такой конфигурации. Роутер не обработает такую конфигурацию со стрингом в контексте, потому что ProductListViewController говорит что ему что бы быть построенным контекст должен быть nil и точка. В случае же с Any? такая цепочка будет валидной так как ProductListViewController в общем то все равно что там может быть передано для предыдущих и последующих вью контроллеров. Он явно указывает на это роутеру.
Тут все совершенно верно. Но в наших приложениях всегда присутствует некий контекст который содержит в себе помимо данных для построения вью контролера (или отсутствия таковых) обязательные поля для аналитики которые продиктованы протоколами. Какие то должны быть заполнены в ручную, какие то заполняется делегатами того же `UINavigationController`-а, что бы отслеживать перемещение пользователя в приложении (в том числе когда он делает тот же свайп бэк) и потом все это автоматически (и не очень) сабмитится в аналитику, поэтому если мы хотим сказать что там точно что то будет и кто то это будет обрабатывать, но самому вью контролеру все равно — мы используем Any?.. Пожалуй, в качестве абстрактного примера и правда стоит отметить в статье, что при желании можно использовать Void
Хороший вопрос. Если вы хотите сказать что это именно nil и ничего больше — используйте Void. Но этот тип не подходит для контейнеров (в тот же UINavigationController) так как в них может быть встроен вью контроллер которому потребуется некий отличный от nil объект и рутер не сможет построить цепочку так как контейнер будет четко указывать роутеру что он может быть построен исключительно с nil и все его внутренние вью контроллеры в том числе.
Any? является универсальным, сообщая роутеру что он может игнорировать в данном конкретном случае проверку типов. Но для вашего конечного вью контроллера вы можете использовать Void
Но в целом — хорошая обзорная статья которую хорошо иметь под рукой.
Спасибо
Точнее можно, но тогда роутер не сможет вам гарантировать никакого привидения типов. Придется взеде сказать что это Any? и в фабриках проверять тип вручную, или использовать Dictionary контекст и бросать эксепшен если в нем не хватает чего то что нужно одному из вью контроллеров в цепочке.
Но, в нашей практике даже близко таких запросов не возникало. Обычно требуется один, максимум два контроллерва в стеке построить за раз. Но, как видно из примера выше, подход достаточно гибкий и если такой запрос встретиться — его можно реализовать.
Грубо говоря да. Или в связке где все экраны хотят nil и ни в коем случае что то иное. Наверное, такое тоже имеет место быть.
Тут следует еще уточнить логику работы роутера, мне не хотелось вдаваться в подробности в статье.
Роутер раскручивает конфигурацию назад пока не дойдет до конца или не встретит вью контроллер который уже построен (ну и проверит что все предыдущие контроллеры присутствуют как надо), после этого будет двигаться по конфигурации вперед и строить недостающие. В том же навигейшен стеке может быть любое количество вью контроллеров с разными контекстами или без них. Просто нельзя сконфигурировать за раз такой навигейшен контроллер с нуля с заполненым стеком.
Но, кстати, щас подумал — Void наложит еще одно ограничение.
Допустим у вас конфиграция (образно):
И допустим пришла вам универсальная ссылка с айди продукта и вы хотите построить именно в такой конфигурации. Роутер не обработает такую конфигурацию со стрингом в контексте, потому что ProductListViewController говорит что ему что бы быть построенным контекст должен быть nil и точка. В случае же с Any? такая цепочка будет валидной так как ProductListViewController в общем то все равно что там может быть передано для предыдущих и последующих вью контроллеров. Он явно указывает на это роутеру.
Хороший вопрос. Если вы хотите сказать что это именно nil и ничего больше — используйте Void. Но этот тип не подходит для контейнеров (в тот же
UINavigationController
) так как в них может быть встроен вью контроллер которому потребуется некий отличный от nil объект и рутер не сможет построить цепочку так как контейнер будет четко указывать роутеру что он может быть построен исключительно с nil и все его внутренние вью контроллеры в том числе.Any? является универсальным, сообщая роутеру что он может игнорировать в данном конкретном случае проверку типов. Но для вашего конечного вью контроллера вы можете использовать Void
В самом начале статьи
https://github.com/saksdirect/route-composer