我有一堆定义我的值类型的结构。其中许多符合我称之为DictConvertible
的协议。我想做一个扩展,说明实现DictConvertible
的所有内容都会获得实现DataRepresentable
的扩展(来自Haneke cache project)。
有什么方法可以表达这个吗?我以为我能做到
extension DictConvertible : DataRepresentable { ... }
但我错了
更新:我不是很清楚,但我想要进行扩展的原因是我可以实现DataRepresentable
中定义的函数,这样我就不必在每个结构中实现它实现DictConvertible
。
答案 0 :(得分:2)
正确:您无法扩展协议以符合(“继承”)其他协议。您应该定义协议以符合其他协议:
#include <stdio.h>
static void foo(void)
{
int i;
asm volatile ("mov 16(%%rbp), %0" : "=g" (i));
printf("%d\n", i);
}
#define foo(x) ({ int _i = (x); \
asm ("push %0\ncall %P1\nadd $8, %%rsp\n" : : "g"(_i), "i"(foo)); })
int main(int argc, char *argv[])
{
foo(argc-1);
return 0;
}
完成后,您确实可以扩展DictConvertible以提供DataRepresentable所需的默认实现:
protocol DictConvertible : DataRepresentable {
// ... and the rest as you already have it ...
}
或者,定义符合这两者的协议:
extension DictConvertible {
func functionRequiredByDataRepresentable() {
// ... code ...
}
}
...现在你可以制作所有并且只有符合这两者的结构符合这种组合协议。同样,您可以扩展此协议以提供DictConvertible或DataRepresentable所需的默认实现。