约束为相等的通用类型不能相互转换

时间:2018-02-16 12:08:44

标签: swift generics types protocols

首先关闭:我正在使用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)

        //...
    }
}

此层次结构背后的想法是,GraphGraph.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>]
}

例如:

Problem 1

如果我更改方法参数的类型,我甚至会得到以下内容:

Problem 2

在我看来,编译器只是忽略了where - 子句,因此无法识别Edge.Vertex_Graph.Vertex是否相等。

我不确定,所以如果有人知道发生了什么,我会很高兴听到它:)

0 个答案:

没有答案