从常规方法调用协议默认实现

我想知道是否有可能实现这样的事情。
我有这样一个游乐场:

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需要默认实现中的所有内容以及其他内容呢?
这跟调用super.很像super.class上实施各种财产的要求等,但我认为没有可能达到与structs相同。

我不知道你是否还在寻找答案,但是要做到这一点,就是从协议定义中删除函数,将你的对象转换为Foo ,然后调用它的方法:

 protocol Foo { // func testPrint() <- comment this out or remove it } extension Foo { func testPrint() { print("Protocol extension call") } } struct Bar: Foo { func testPrint() { print("Call from struct") (self as Foo).testPrint() // <- cast to Foo and you'll get the default // function defined in the extension } } Bar().testPrint() // Output: "Call from struct" // "Protocol extension call" 

由于某种原因,只有在函数没有被声明为协议的一部分时才起作用,但是在协议的扩展中被定义。 去搞清楚。 但它确实有效。

那么你可以创build一个符合协议的嵌套types,实例化它,然后调用该方法(无论如何,由于协议扩展内部的实现无法引用,无法访问types的数据并不重要)。 但这不是我称之为优雅的解决scheme。

 struct Bar: Foo { func testPrint() { // Calling default implementation struct Dummy : Foo {} let dummy = Dummy() dummy.testPrint() print("Call from struct") } } 

感谢您的post! 如果将函数定义放在协议中,那么当对象作为协议进行转换时,它只能看到对象的函数版本,而且由于您在自己内部调用它,您将得到Apple的新地址…

我曾尝试过这样的版本:

 import UIKit protocol MyProc { } protocol MyFuncProc { func myFunc() } extension MyProc { func myFunc() { print("Extension Version") } } struct MyStruct: MyProc, MyFuncProc { func myFunc() { print("Structure Version") (self as MyProc).myFunc() } } (MyStruct() as MyFuncProc).myFunc() 

这给出了一个输出:

 Structure Version Extension Version