首先关闭:我正在使用Swift Development Snapshot 2018-02-13(a),因此可能会导致问题。
我遇到了Swift的泛型问题 该问题围绕两种类型参数通用的类型:
struct Graph<Value, Edge: EdgeType>
Value
不受约束,Edge
被限制为EdgeType
:
protocol EdgeType: Hashable {
associatedtype Vertex_: VertexType
//...
}
现在EdgeType
有一个名为Vertex
的关联类型被约束为VertexType
:
protocol VertexType: AnyObject, Hashable {
associatedtype Value_
//...
}
Graph
有一个嵌套类型Vertex
,符合此协议:
extension Graph {
final class Vertex: VertexType {
typealias Value_ = Value // (`Graph`'s generic type parameter)
//...
}
}
此层次结构背后的想法是,Graph
将Graph.Vertex
用于其顶点,并约束其通用Edge
类型参数以将该顶点类型用作其Vertex_
。
所以我添加了一个where
- 子句:
struct Graph<Value, Edge: EdgeType> where Edge.Vertex_ == Graph.Vertex { //... }
这会导致Edge.Vertex_
和Graph.Vertex
属于同一类型。
现在问题:编译时我在多个看似不相关的行上得到以下错误:
'Edge.Vertex_' is not convertible to 'Graph<Value, Edge>.Vertex'
这些行的共同之处在于它们包含一些关于graphTable
的声明:
struct Graph<Value, Edge: EdgeType> where Edge.Vertex_ == Graph.Vertex {
private var graphTable: [Vertex: Set<Edge>]
}
例如:
如果我更改方法参数的类型,我甚至会得到以下内容:
在我看来,编译器只是忽略了where
- 子句,因此无法识别Edge.Vertex_
和Graph.Vertex
是否相等。
我不确定,所以如果有人知道发生了什么,我会很高兴听到它:)