TL; DR
Компилятору не хватает достаточно информации для сравнения типа , пока не будет установлен соответствующий тип .
Когда вы ссылаетесь на простой протокол, компилятор знает его тип с самого начала.Но когда вы ссылаетесь на протокол с ассоциированным типом , компилятор не знает его тип, пока вы не объявите его.
protocol ExampleProtocol {
associatedtype SomeType
func foo(param: SomeType)
}
На данный момент для компилятора это выглядит так:
protocol ExampleProtocol {
func foo(param: <I don't know it, so I'll wait until it's defined>)
}
Когда вы объявляете класс, соответствующий протоколу
class A: ExampleProtocol {
typealias SomeType = String
func foo(param: SomeType) {
}
}
Компилятор начинает видетьэто так:
protocol ExampleProtocol {
func foo(param: String)
}
и , тогда можно сравнивать типы.