从常规方法调用协议默认实现
我想知道是否有可能实现这样的事情。
我有这样一个游乐场:
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