У меня такая же ситуация, и я также не уверен, как лучше всего с ней справиться. У меня есть viewController, который должен использоваться в разных координаторах.
Это нормально, когда данному viewController сам координатор не нужен. Например, давайте назовем это DisplayPopupViewController.
Я создаю протокол под названием CanDisplayPopupProtocol:
protocol CanDisplayPopupProtocol {}
extension CanDisplayPopupProtocol where Self: Coordinator {
func toDisplayPopupViewController() {
let vc = DisplayPopupViewController.instantiate()
navigationController.pushViewController(vc, animated: true)
}
}
Тогда в Coordidnator1:
extension Coordinator1: CanDisplayPopupProtocol{}
А в Coordinator2:
extension Coordinator2: CanDisplayPopupProtocol{}
Теперь оба координатора имеют метод toDisplayPopupViewController ().
Как я уже говорил, это нормально, когда мне не нужно передавать координатор viewController, в этом случае DisplayPopupViewController не нуждается в координаторе, поскольку он будет отклонен и не будет нуждаться в навигации.
Но это становится намного сложнее, когда в этом случае необходимо назначить координатор viewController, какой координатор я передаю?
Решение, которое я нашел, которое не очень элегантно с моей точки зрения, состоит в том, чтобы изменить тип координатора в viewController на протокол Coordinator, поэтому вместо этого:
weak var coordinator: Coordinator1?
Я буду использовать:
weak var coordinator: Coordinator?
А затем в CanDisplayPopupProtocol я проверю, с каким координатором я имею дело, и назначу правильный координатор viewController, например:
protocol CanDisplayPopupProtocol {}
extension CanDisplayPopupProtocol where Self: Coordinator {
func toDisplayPopupViewController() {
let vc = DisplayPopupViewController().instantiate()
switch self {
case is Coordinator1:
vc.coordinator = self as? Coordinator1
case is Coordinator2:
vc.coordinator = self as? Coordinator2
default: break
}
navigationController.pushViewController(vc, animated: true)
}
}
Это не красиво, и есть еще один недостаток. Внутри DisplayPopupViewController каждый раз, когда мне нужно использовать один из методов координатора, мне нужно проверить, какой тип координатора я использую.
switch coordinator {
case is Coordinator1:
(coordinator as! Coordinator1).toDisplayPopupViewController()
case is Coordinator2:
(coordinator as! Coordinator2).toDisplayPopupViewController()
default: break
}
Я уверен, что это не лучшее использование протоколов, надеюсь, кто-то, кто следует этой теме, найдет лучшее решение для этой проблемы.