我有两个协议PA
和PB
,其中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非常相似,但这里的主要区别是PB
是PA
的严格子集,因此我可以确定任何< / em>符合PA
的类型也符合(或至少可以符合)PB
。进一步搜索,似乎这也可能是this question的欺骗,虽然我不确定。
请注意,为了创建SSCCE,我已经大大简化了问题。