【发布时间】:2016-01-13 22:01:42
【问题描述】:
采用以下协议和扩展:
protocol ProtocolA {
func myFunc()
}
extension ProtocolA {
func myFunc() {
print("Default ProtocolA implementation.")
}
}
这与将函数完全排除在协议定义之外有什么区别(如果有的话),如下所示:
protocol ProtocolB { }
extension ProtocolB {
func myFunc() {
print("Default ProtocolB implementation.")
}
}
我发现了一个不同之处。如果我定义了一个覆盖默认实现的结构,我只能将它转换为协议并在我将函数排除在定义之外时调用协议的实现:
struct A: ProtocolA {
func myFunc() {
print("Struct A's implementation.")
}
}
struct B: ProtocolB {
func myFunc() {
print("Struct B's implementation.")
}
}
A().myFunc() // "Struct A's implementation."
(A() as ProtocolA).myFunc() // "Struct A's implementation."
B().myFunc() // "Struct B's implementation."
(B() as ProtocolB).myFunc() // "Default protocol implementation."
换句话说,如果您像ProtocolB 那样将函数从协议定义中取出,那么您可以通过将对象转换为协议来访问默认实现。另一方面,如果您将函数留在协议定义中,则无法强制转换为协议以获得默认协议行为。
将函数定义排除在协议之外似乎可以在行为方面提供最大的灵活性。
有什么缺点?如果你把函数从协议定义中去掉,你会失去什么?您是否完全失去了任何功能?
【问题讨论】: