Size: a a a

iOS Developers — русскоговорящее сообщество

2021 April 19

DK

Denis Kim in iOS Developers — русскоговорящее сообщество
не понимаю зачем задавать вопрос а потом скатываться в холивар
источник

В

Вовка in iOS Developers — русскоговорящее сообщество
А как ты VM инжектишь в свои VC?
источник

Д

Денис in iOS Developers — русскоговорящее сообщество
Ок, я расскажу подробнее - метод foo(), он указан в публичном интерфейсе, но другого протокола. Этот протокол, среди прочих, реализуется ConcreteVC’ом. То, что ты называешь зависимостью от реализации по сути не является зависимостью, ибо она опциональна. Дефолтная имплементация может быть (при совпадении условий, требуемых ею), либо отсутствовать, тогда реализуй сам этот метод foo().
источник

В

Вовка in iOS Developers — русскоговорящее сообщество
Я вижу в экстеншене протокола метод print, а не foo.
источник

Д

Денис in iOS Developers — русскоговорящее сообщество
Я упростил, чтобы было понятнее и не загромождать лишней информацией
источник

В

Вовка in iOS Developers — русскоговорящее сообщество
Ты меня совсем запутал.

Ты подключаешь 2 протокола, в втором есть реализация метода из 1 протокола?
источник

Д

Денис in iOS Developers — русскоговорящее сообщество
Сейчас у меня проект, где верстка польностью идет кодом, поэтому да, я могу задженерить VC, но придется довольно много переколбасить. Да и сложность проекта, когда все обмазано дженериками растет экспоненциально. Хотелось бы раз и навсегда разобраться во всем этом associatedtype
источник

В

Вовка in iOS Developers — русскоговорящее сообщество
Ты сейчас экспоненту на экспоненту положил вот этой выдуманной схемой.
источник

В

Вовка in iOS Developers — русскоговорящее сообщество
Почему ты просто не сделаешь протокол для описания VM?
источник

Д

Денис in iOS Developers — русскоговорящее сообщество
Вот более точный пример
ConcreteVC должен реализовать метод printAll() ибо того требует протокол AllPrintable. Дефолтная реализация для протокола PrintingViewController может предоставить дефолтную реализацию этого метода, если viewModel умеет в Printable. Если viewModel другого типа - реализуй printAll() как считает нужным сам
источник

В

Вовка in iOS Developers — русскоговорящее сообщество
Окей, задам-таки вопрос: Зачем тебе у конкретного VC VM под протоколом?
источник

Д

Денис in iOS Developers — русскоговорящее сообщество
И все это работает, но только если viewModel является классом/структурой/enum. Но не протоколом
источник

Д

Денис in iOS Developers — русскоговорящее сообщество
Вопрос в том, зачем закрывать виью модели протоколами и абстрагироваться от их конкретных реализаций?
источник

Д

Денис in iOS Developers — русскоговорящее сообщество
Ответ - в проекте есть unit тесты, которые под видом viewModels кидают mock объекты
источник

В

Вовка in iOS Developers — русскоговорящее сообщество
Ну и второй вопрос: зачем тебе в притабл протоколе viewModel под ассоциацией ?
источник

В

Вовка in iOS Developers — русскоговорящее сообщество
Окей, с этим разобрались. Главное что не “ради протокола".
источник

В

Вовка in iOS Developers — русскоговорящее сообщество
Я прост хочу помочь задавая вопросы уже. Вдруг у тебя мысль поменяется. Так как рил задачка упирается в сториборд))
источник

Д

Денис in iOS Developers — русскоговорящее сообщество
Ну не только в сториборд. Не все любят проекты, где VC на дженериках. Просто я когда каждый раз хочу избавиться от дублирования кода, и не уходить в ООП, все это сводится к дженерикам, которые уходят в другие дженерики и далее по всему проекту. И это если только верстка идет без сторибордов. А такой проект мне впервые достался.

Немного изменил пример, может будет казаться более понятным:
источник

Д

Денис in iOS Developers — русскоговорящее сообщество
источник

Д

Денис in iOS Developers — русскоговорящее сообщество
Printable это лишь протокол, который реализует viewModel внутри VC. VC не знает ничего об ассоциации. Ассоциация нужна для того, чтобы подмешать это дефолтное поведение разным VC, которых объединяет лишь одно - их viewModel (не важно какой у нее тип в итоге) реализует Printable. Пометка любой VC этим протоколом может дать ей дефолтное поведение (а может и не дать, если viewModel вообще левая)
источник