Разница между обобщенными и ассоциированными типами заключается в том, что обобщенные значения указываются при создании экземпляра, а связанные с ним типы при реализации. Таким образом, вы не можете использовать тип протокола в качестве конкретного типа, потому что связанный тип зависит от типа реализации.
Однако есть несколько обходных путей:
1) Используйте тип делегата в качестве универсального типа:
class MyType<Delegate: GenericProtocol> {
typealias T = Delegate.type
...
}
2) Используйте общий протокол в методе делегата вместо связанного типа:
protocol CommonProtocol { ... }
protocol DelegateProtocol {
func funca(component: CommonProtocol)
}
3) Используйте замыкания для стирания типов (это также делается в стандартной библиотеке Swift для протокола Sequence
с AnySequence<Element>
)
struct AnyGenericProtocol<GenericType>: GenericProtocol {
typealias type = GenericType
private let f: (GenericType) -> ()
init<G: GenericProtocol>(_ g: GenericProtocol) where G.type == GenericType {
f = { component in
g.funca(component: component)
}
}
func funca(component: GenericType) {
f(component)
}
}
class MyType<T> {
var delegate: AnyGenericProtocol<T>
...
}