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

时间:2016-01-30 20:59:44

标签: swift swift2 protocols

我有一堆定义我的值类型的结构。其中许多符合我称之为DictConvertible的协议。我想做一个扩展,说明实现DictConvertible的所有内容都会获得实现DataRepresentable的扩展(来自Haneke cache project)。

有什么方法可以表达这个吗?我以为我能做到

extension DictConvertible : DataRepresentable { ... }

但我错了

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

1 个答案:

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