【发布时间】:2017-12-19 08:34:17
【问题描述】:
我正在尝试定义一个扩展协议 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”的类型别名更好地表示为协议上的相同类型约束
protocol B: A {
typealias C = D
}
让它在没有警告的情况下编译的唯一方法是在类 E 中指定类型别名并使用协议 B 中的 where 子句,但这似乎重复了不必要的类型别名:
protocol B: A where C == D {
}
class E: B {
typealias C = D
}
【问题讨论】: