我在想是否有可能实现这样的事情。
我有一个这样的Playground:
protocol Foo {
func testPrint()
}
extension Foo {
func testPrint() {
print("Protocol extension call")
}
}
struct Bar: Foo {
func testPrint() {
// Calling self or super go call default implementation
self.testPrint()
print("Call from struct")
}
}
let sth = Bar()
sth.testPrint()
我可以在extension
中提供一个默认实现,但是如果Bar
需要默认实现中的所有内容以及其他内容,该怎么办?
这在某种程度上类似于在class
中调用super.
方法来满足实现每个属性等的要求,但我认为不可能用structs
实现同样的要求。
6条答案
按热度按时间bfnvny8b1#
我不知道您是否还在寻找答案,但解决方法是从协议定义中删除函数,将对象转换为
Foo
,然后在其上调用方法:由于某种原因,只有当函数没有被声明为协议的一部分,而是在协议的一个扩展中定义时,它才能工作。
kmpatx3s2#
你可以创建一个符合协议的嵌套类型,示例化它,然后调用它的方法(你不能访问你的类型的数据并不重要,因为协议扩展内部的实现无论如何都不能引用它),但我认为这不是一个优雅的解决方案。
0dxa2lsx3#
你认为这样解决办法怎么样?
olhwl3o24#
如果你把函数定义放在协议中,那么当对象被转换为协议时,它只会看到对象的函数版本,因为你是在它自己内部调用它,所以你会得到Apple的新地址。
我确实试过这样一个版本:
这将给出以下输出:
lf5gs5x25#
如果您的通信协定有
associatedType
或Self
需求,则转换将无法运作。若要解决这个问题,请建立一般预设实作和相容型别都可以呼叫的“阴影”预设实作。wsewodh26#
我已经想出了一个解决办法。
问题
当你在一个扩展中有一个默认的实现时,当你在另一个类/结构中实现协议时,如果你实现了方法,你就会失去这个默认的实现。这是设计的,这是协议的工作方式
溶液
示例
缺点
在实现此协议的结构/类中丢失了所需的实现错误。