表示符合一种协议的所有类型也符合另一种协议

时间:2017-10-26 20:03:06

标签: swift protocols

我有两个协议PAPB,其中PB的要求是PA的要求的子集。我不控制PA。我想表达一个事实,即任何符合PA的实例也符合PB,但我无法弄清楚如何这样做。我试过了:

extension PA: PB {}

但编译错误。这是一个完整的例子:

protocol PA { func sayHello() }
protocol PB {}

struct S: PA, PB {
    func sayHello() { print("hello") }
}

func takesPB(_ thing: PB) {}

let s1: S = S()
let s2: PA = S()
takesPB(s1)  // No error
takesPB(s2)  // error: argument type 'PA' does not conform to expected type 'PB'
extension PA: PB {}  // error: extension of protocol 'PA' cannot have an inheritance clause

在此示例中,PB没有要求,因此很明显,符合PA的任何类型 - 或者实际上任何类型 - 都应符合PB。但是,我找不到向编译器表达这种关系的方法。

此问题与this one非常相似,但这里的主要区别是PBPA的严格子集,因此我可以确定任何< / em>符合PA的类型也符合(或至少可以符合)PB。进一步搜索,似乎这也可能是this question的欺骗,虽然我不确定。

请注意,为了创建SSCCE,我已经大大简化了问题。

0 个答案:

没有答案