ivlevAstef / DITranquillity

Dependency injection for iOS (Swift)
MIT License
421 stars 32 forks source link

SwiftPM и Storyboards #158

Closed kocherovets closed 3 years ago

kocherovets commented 3 years ago

Добрый день! Планируется ли добавить поддержку Storyboards при установке через SwiftPM? Если нет, то можно ли выделить функционал со Storyboards для отдельной установки пусть даже через подсы? И можно ли сейчас вручную как-то выделить эту часть, чтобы вручную добавить в проект в таргет с UI? Или может быть текущее положение было так задумано, тогда как предполагается пользоваться SwiftPM в связке со Storyboards?

ivlevAstef commented 3 years ago

Здравствуйте. Советую прочитать до конца или самый конец - там написано наиболее простое решение, требующее минимального количества усилий. Теперь по теме :)

Нет этого делать не планируется. Причина в поддержке - SwiftPM это пакетный менеджер Swift-а. Возможности которые сделаны со сторибоардами, это возможности Obj-C языка. На Swift нельзя сделать этот функционал по работе со Storyboard. По этой самой причине его нельзя занести в SwiftPM пакет.

Дальше сказывается тот факт, что Storyboard в наше время это как мамонты - ими никто не пользуется (почему? -есть куча статей в интернете). Пользуются ими только старые проекты которые скорей всего не используют мою библиотеку, и еще мало вероятней используют SwiftPM.

Вынести работу со сторибоард в отдельную репу возможно, только при этом придется нарушить инкапсуляцию, и она точно не будет SwiftPM. Если решите для своего проекта это сделать, то надо:

  1. Зайти в репозиторий и скопировать все что в папке Sources/UI.
  2. Вставить это содержимое к себе в проект. Предупреждаю - там есть как Swift так и Obj-C файлы.
  3. Сделать так чтобы эти файлы видели DITranquillity.
  4. В самой библиотеке (можно через fork) сделать:
    • Класс Component публичным.
    • Внутри DIContainer свойство frameworkStack тоже публичным (это рекурсивно заставит Stack и его метод last сделаться публичным)
    • Внутри DIComponentBuilder сделать публичным свойство component
    • Возможно что-то еще сделать public

В силу того, что Storyboard это устаревшая система, и если его выносить отдельно будет нарушена инкапсуляция, то я не хочу этого делать на основной репе.

P.S. На самом деле это возможно, но это скорее хаки, нежели хорошие решения. P.P.S. Cocoapods и SwiftPM отлично работают вместе на одном проекте. P.P.P.S. Если вы переписываете старый проект, на новый код, то лучше придерживаться жесткого правила: Новый код ничего не знает о старом, а старый может знать о новом. P.P.P.P.S. Если Storyboard используются без sequence, то функционал библиотеки по работе со Storyboard не нужен. Всегда можно самому зарегистрировать VC так чтобы он создавался из Storyboard, и в коде использовать за место внедренного storyboard несколько провайдеров:

container.register { Storyboard("name").instantiateVC("vcname") }
YourRouter/Navigator/Coordinator/Wireframe {
  init(vc1Provider: Provider<YourVC>, vc2Provider: Provider<YourVC2>) { ...
}
  func f() { let vc = vc1Provider.value }
}

P.P.P.P.P.S. :) если слегка закрыть глаза на то, что singleton это зло то можно в DI местах убрать все регистрации Storyboard, а во всех своих VC, которые создавались из storyboard, написать:

func viewDidLoad() { // или можно внутри метода init?(coder: NSCoder)
   super.viewDidLoad()
   MyShared.container.inject(into: self, from: YourFramework.self) // можно
без from если у вас не многомодульное приложение.
}

Это самый простой способ, требующий всего одной жертвы - сделать чтобы container хранился где-то и был доступен отовсюду. А написать код во всех VC создаваемых с помощью Storyboard проблема на пару часиков. То есть сделать то, что делает библиотека автоматически, ручками :)

пт, 27 нояб. 2020 г. в 20:29, kocherovets notifications@github.com:

Добрый день! Планируется ли добавить поддержку Storyboards при установке через SwiftPM? Если нет, то можно ли выделить функционал со Storyboards для отдельной установки пусть даже через подсы? И можно ли сейчас вручную как-то выделить эту часть, чтобы вручную добавить в проект в таргет с UI? Или может быть текущее положение было так задумано, тогда как предполагается пользоваться SwiftPM в связке со Storyboards?

— You are receiving this because you are subscribed to this thread. Reply to this email directly, view it on GitHub https://github.com/ivlevAstef/DITranquillity/issues/158, or unsubscribe https://github.com/notifications/unsubscribe-auth/ABKDCH67GEL4TRFSQKZV6C3SR6STZANCNFSM4UE5HHWA .

-- С уважением, Александр Ивлев ivlev.stef@gmail.com; ivlev.stef@mail.ru

kocherovets commented 3 years ago

Спасибо, посмотрю все варианты, что будет лучше. Было бы хорошо добавить эти варианты в доку, может быть как сноску какую-то.