我正在尝试定义扩展协议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
}
答案 0 :(得分:2)
我认为协议声明的相同类型约束在符合该协议时不会被类读取。
为避免类型化的重复,您可以从协议B中删除相同类型的约束,并使用扩展来为协议B提供类型。
class D {
}
protocol A: class {
associatedtype C
}
protocol B: A {
}
extension B {
typealias C = D
}
class E: B {
}