使用协议扩展符合协议的结构

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 所需的默认实现。