В настоящее время MyPresenter
не удовлетворяет требованиям условия where расширения PresentationLogic
, поэтому не может использовать реализацию по умолчанию show(_:)
. В частности, он не проходит тест для Self.DisplayLogic: DefaultDisplayLogic
. Следовательно, он не соответствует PresentationLogic
, и поэтому он также не соответствует MyPresentationLogic
, который наследуется от PresentationLogic
.
Но почему бы и нет? Я думаю, это связано с тем, как работает Swift: протоколы не могут соответствовать самим себе. В MyPresenter
, Self.DisplayLogic
равно MyDisplayLogic
. Хотя это дочерний протокол DefaultDisplayLogic
, он все еще функционирует как «протокол, пытающийся соответствовать себе», поэтому он не работает.
Чтобы продемонстрировать это, вы можете заменить weak var viewController: MyDisplayLogic?
на weak var viewController: MyViewController
, и ошибка исчезнет, поскольку это конкретный тип, соответствующий DefaultDisplayLogic
. Кроме того, если вы измените Self.DisplayLogic: DefaultDisplayLogic
в предложении where на Self.DisplayLogic == MyDisplayLogic
, ошибка исчезнет, потому что вам требуется определенный тип, а не соответствие.
В вашем случае возможное решение - сделать MyPresenter
универсальным классом. Например:
class MyPresenter<ConcreteDisplayLogic: DefaultDisplayLogic>: Presenter, MyPresentationLogic {
weak var viewController: ConcreteDisplayLogic?
}
Это позволит вам использовать те же ограничения условия where для реализации по умолчанию show(_:)
, обеспечивая при этом безопасную для типов обобщенную реализацию MyPresenter
.
У этого подхода есть ограничение: вы не можете изменить тип значения viewController
для одного экземпляра MyPresenter
.