一尘不染

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

swift

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

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需要默认实现中的所有内容以及其他内容,该怎么办?
它在某种程度上类似于es中的调用super.方法,class可以满足实现每个属性等的要求。但是我看不到用实现相同的可能性structs


阅读 282

收藏
2020-07-07

共1个答案

一尘不染

我不知道您是否还在寻找答案,但是要做的方法是从协议定义中删除函数,将对象转换为对象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"

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

2020-07-07