Swift 4协议组成一致性

Gri*_*ear 11 swift swift4

[ 首先,如果有人对问题有更好的名称,提案就会被广泛接受.到目前为止,我没有找到更好的名称.]

所以,这就是问题所在.

假设我有一个协议ProtocolA,协议ProtocolB和协议ProtocolX定义如下:

protocol ProtocolA {
  func doSomethingA()
}

protocol ProtocolB {
   func doSomethingB()
}

protocol ProtocolX {
   var handler: ProtocolA { get }
}
Run Code Online (Sandbox Code Playgroud)

然后我在ProtocolX的一个类中有一个正确的实现,如下所示:

class Donald: ProtocolX {
   ...
   var handler: ProtocolA { ... }
   ...
}
Run Code Online (Sandbox Code Playgroud)

然后一切正常,协议要求得到正确履行.

如果我这样实现:

class Donald: ProtocolX {
   ...
   var handler: ProtocolA & ProtocolB
   ...
}
Run Code Online (Sandbox Code Playgroud)

我有一个编译时问题,报告我的类Donald不符合ProtocolX(根据规范,要求var handler必须符合ProtocolA).

从理论上讲,var handlerIS符合ProtocolA(但它也符合ProtocolB).

然后我的问题是:为什么编译时问题?我身边的迅速限制或概念问题?

AD *_*ess 0

您可以通过扩展其中一个协议来实现另一个协议来解决该问题,这样您就可以解决该问题。

你可以让A继承B:

protocol ProtocolA: ProtocolB {
  func doSomethingA()
}

protocol ProtocolB {
   func doSomethingB()
}

protocol ProtocolX {
   var handler: ProtocolA { get }
}
Run Code Online (Sandbox Code Playgroud)

由于 A 继承自 B,因此 B 中的每个属性在 A 中都可用。

然后您可以在协议 X 中使用它们,因为 A 继承自 b

检查这个答案


归档时间:

查看次数:

850 次

最近记录:

7 年,3 月 前