Отличная работа, давно планирую начать делать свой проект на Viper в свободное от работы время, а это именно то что нужно, т.к наработки Rambler уже не актуальны, имхо.
Я часто использую один экран - один сторибоард благодаря этому, можно написать это:
class HomeViewController: UIViewController {
static func storyboardInstance() -> HomeViewController? {
let storyboard = UIStoryboard(name: String(describing: self), bundle: nil)
return storyboard.instantiateInitialViewController() as? HomeViewController
}
}
let homeViewController = HomeViewController.storyboardInstance()
Не знаю, подходит ли эта концепция для Viper c DI. Но я попробую объяснить свою точку зрения. В вашем примере есть такое:
private lazy var transitionModuleFactory: StoryboardFactoryProtocol = {
let factory = StoryboardFactory(storyboard: self.mainStoryboard, restorationId: self.thirdModuleID)
return factory
}()
Однако, если мне нужен переход на другой сторибоард где только один экран, то это свойство будет ненужным. Можно перенести создание фабрики прямиком в метод:
let factory = StoryboardFactory(storyboard: self.thirdStoryboard)
transitionHandler
.forStoryboard(factory: factory).....
А можно пойти дальше и расширить ваш класс добавив "стандартную" factory в метод(Знаю что подобная инициализация объекта плохой пример):
func forStoryboard<T>(storyboard:UIStoryboard, to type: T.Type) -> TransitionPromise<T> {
return forStoryboard(factory: StoryboardFactory(storyboard: storyboard), to: type)
}
func forStoryboard<T>(factory: StoryboardFactoryProtocol, to type: T.Type) -> TransitionPromise<T> {
let destination = factory.instantiateTransitionHandler
//...
Исходя из этого, можно сделать переход таким:
transitionHandler
.forStoryboard(storyboard: thirdStoryboard, to: ThirdModuleModuleInput.self)
.to(preferred: TransitionStyle.navigationController(preferredStyle: .push))
.then { moduleInput in
moduleInput.configure(with: data)
}
Это всего лишь идея улучшения функционала.