【问题标题】:Extend structs that conform to a protocol with a protocol使用协议扩展符合协议的结构
【发布时间】:2016-01-30 20:59:44
【问题描述】:

我有一堆定义我的值类型的结构。它们中的许多都符合我称为DictConvertible 的协议。我想做一个扩展,说所有实现DictConvertible 的东西都会得到这个实现DataRepresentable 的扩展(来自Haneke cache project)。

有什么好的方法可以表达这一点吗?我以为我能做到

extension DictConvertible : DataRepresentable { ... }

但我错了

更新:我不是很清楚,但我想做扩展的原因是我可以实现DataRepresentable中定义的函数,这样我就不必在每个实现@的结构中实现它987654327@.

【问题讨论】:

    标签: swift swift2 protocols


    【解决方案1】:

    正确:您不能扩展协议以符合(“继承”)另一个协议。您应该简单地定义协议以符合其他协议:

    protocol DictConvertible : DataRepresentable {
         // ... and the rest as you already have it ...
    }
    

    完成后,您确实可以扩展 DictConvertible 以提供 DataRepresentable 所需的任何默认实现:

    extension DictConvertible {
        func functionRequiredByDataRepresentable() {
            // ... code ...
        }
    }
    

    或者,定义一个同时符合它们的协议:

    protocol DictConvertibleAndDataRepresentable : DictConvertible, DataRepresentable {}
    

    ...现在您可以使所有且仅符合两者的结构都符合此组合协议。同样,您可以扩展此协议以提供任何 DictConvertible 或 DataRepresentable 所需的默认实现。

    【讨论】:

    • 谢谢。我现在意识到我的问题并不是很清楚,但是在扩展({ ... } 位)中,我想实现实现协议DataRepresentable 的功能。通过创建一个继承的协议,我不会添加这个默认实现,对吧?
    • 错了。 :) 正如我在回答中所说,您声明协议 A 采用协议 B 不能在协议 A 的扩展中。但是您对任何协议 B 声明的 实现 肯定可以。试试看!
    • 将其添加到我的答案中。
    • 酷,非常感谢! :-) 现在我理解得更好了,并且能够按照您的建议进行操作。 :-) 再次感谢! :-)
    • 很高兴为您提供帮助。老实说,我不明白为什么您不能使用协议扩展来声明该协议采用了另一个协议。这似乎是语言中的任意漏洞。
    猜你喜欢
    • 1970-01-01
    • 2013-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-03
    • 1970-01-01
    • 2016-04-30
    • 1970-01-01
    相关资源
    最近更新 更多