Проблема в том, что хотя edges
соответствует EdgeProtocol
, а EdgeProtocol
содержит VertexType
связанный тип, компилятор не может знать, что это будет тот же тип, что и VertexProtocol
's VertexType
связанный тип.Оба протокола VertexType
будут соответствовать VertexProtocol
, но они не обязательно должны быть одного типа.Поэтому edges.map { $0.to }
возвращает [EdgeType.VertexType]
, но ваша функция объявлена как возвращающая [Self.VertexType]
, так что это несоответствие типов.
Это можно исправить, явно указав, что оба VertexType
одинаковы.Вы можете сделать это либо в определении:
protocol VertexProtocol {
associatedtype VertexType
associatedtype EdgeType: EdgeProtocol where EdgeType.VertexType == VertexType
// ...
}
Или, если это нецелесообразно, вы можете ограничить расширение:
extension VertexProtocol where EdgeType.VertexType == VertexType {
func neighbours() -> [VertexType] {
return edges.map { $0.to }
}
}
Любой из этих подходов должен привести к компиляции кода.