使用协议扩展符合协议的结构
Extend structs that conform to a protocol with a protocol
我有一堆定义我的值类型的结构。它们中的许多都符合我称为 DictConvertible
的协议。我想做一个扩展,说所有实现 DictConvertible
的东西都会得到这个实现 DataRepresentable
的扩展(来自 Haneke cache project)。
有什么好的表达方式吗?我以为我可以做到
extension DictConvertible : DataRepresentable { ... }
但我错了
更新:我不是很清楚,但是我想做一个扩展的原因是我可以实现DataRepresentable
中定义的功能,这样我就不必在每个地方都实现它实现 DictConvertible
.
的结构
正确:您不能扩展协议以符合("inherit" 来自)另一个协议。您应该简单地定义协议以符合其他协议:
protocol DictConvertible : DataRepresentable {
// ... and the rest as you already have it ...
}
完成之后,您确实可以扩展 DictConvertible 以提供 DataRepresentable 所需的任何默认实现:
extension DictConvertible {
func functionRequiredByDataRepresentable() {
// ... code ...
}
}
或者,定义一个同时符合它们的协议:
protocol DictConvertibleAndDataRepresentable : DictConvertible, DataRepresentable {}
...现在您可以使所有且只有那些同时符合两者的结构符合此组合协议。同样,您可以扩展此协议以提供任何 DictConvertible 或 DataRepresentable 所需的默认实现。
我有一堆定义我的值类型的结构。它们中的许多都符合我称为 DictConvertible
的协议。我想做一个扩展,说所有实现 DictConvertible
的东西都会得到这个实现 DataRepresentable
的扩展(来自 Haneke cache project)。
有什么好的表达方式吗?我以为我可以做到
extension DictConvertible : DataRepresentable { ... }
但我错了
更新:我不是很清楚,但是我想做一个扩展的原因是我可以实现DataRepresentable
中定义的功能,这样我就不必在每个地方都实现它实现 DictConvertible
.
正确:您不能扩展协议以符合("inherit" 来自)另一个协议。您应该简单地定义协议以符合其他协议:
protocol DictConvertible : DataRepresentable {
// ... and the rest as you already have it ...
}
完成之后,您确实可以扩展 DictConvertible 以提供 DataRepresentable 所需的任何默认实现:
extension DictConvertible {
func functionRequiredByDataRepresentable() {
// ... code ...
}
}
或者,定义一个同时符合它们的协议:
protocol DictConvertibleAndDataRepresentable : DictConvertible, DataRepresentable {}
...现在您可以使所有且只有那些同时符合两者的结构符合此组合协议。同样,您可以扩展此协议以提供任何 DictConvertible 或 DataRepresentable 所需的默认实现。