As the error says, ChildPresenter
can olny be used as a generic, so you have to place it on the declaration of the class, eg. class A<T: ChildPresenter> : ChildProtocol
protocol BaseProtocol {
associatedtype PresenterType
var presenter: PresenterType? { get set }
}
protocol PresenterProtocol {
associatedtype View
var view: View? { get set }
}
protocol ChildPresenter: PresenterProtocol where View == ChildProtocol {
}
protocol ChildProtocol: BaseProtocol {
}
class A<T: ChildPresenter> : ChildProtocol {
var presenter: T?
func foo(bar: T) {
}
}
You also can use ChildPresenter
instead of T
, like this
class A<ChildPresenter> : ChildProtocol {
var presenter: ChildPresenter?
}
At first it seems that this limits a little bit your class A
, because you have to specify the type of ChilPresenter before initialization, and it can't be modified later, but this is necessary because ChildPresenter
has a associated type.
You can see that without the generic you could get into trouble, imagine that BaseProtocol
had one more property
protocol BaseProtocol {
associatedtype PresenterType
var presenter: PresenterType? { get set }
var presented: PresenterType? { get set }
}
Both presenter
and presented
have to be the same type, because you said it here

And class A
would have one more property too:
class A<ChildPresenter> : ChildProtocol {
var presenter: ChildPresenter?
var presented: ChildPresenter?
}
This way, you guarantee that both presenter
and presented
will have always the same type, because you choose that type when you created an object of A
, eg. let a = A<Foo>()

Without the generic, it would look something like this
class A: ChildProtocol {
var presenter: ChildPresenter?
var presented: ChildPresenter?
}
And in this way, presenter
could be of type Foo
and presented
could be of type Bar
. So you end up with a paradox. Thats why you need to set the generic type in A
's declaration.