Swift协议与使用相同类型约束的关联类型一致

时间:2017-12-19 08:34:18

标签: swift swift4

我正在尝试定义扩展协议A的协议B(后者包含关联的类型C),同时使用具有相同类型约束的where子句,如编译器所建议的那样。但是,执行此操作时,代码将不再编译。这是一个Swift错误(在这种情况下是Swift 4)吗?

更具体地说,下面的代码不会编译错误:

类型'E'不符合协议'A'

class D {

}

protocol A: class {
    associatedtype C: AnyObject
}

protocol B: A where C == D {

}

class E: B {

}

如下所述更改协议B的定义将编译,但会显示此警告:

从协议'A'覆盖关联类型'C'的Typealias更好地表示为协议上的相同类型约束

protocol B: A {
    typealias C = D
}

在没有警告的情况下进行编译的唯一方法是在E类中指定typealias并在协议B中使用where子句,但这似乎复制了不必要的typealias:

protocol B: A where C == D {

}

class E: B {
    typealias C = D
}

1 个答案:

答案 0 :(得分:2)

我认为协议声明的相同类型约束在符合该协议时不会被类读取。

为避免类型化的重复,您可以从协议B中删除相同类型的约束,并使用扩展来为协议B提供类型。

class D {

}

protocol A: class {
    associatedtype C
}

protocol B: A  {
}

extension B {
    typealias C = D
}

class E: B  {
}