当前位置: 首页 > 面试题库 >

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

通奕
2023-03-14
问题内容

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

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


问题答案:

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

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



 类似资料:
  • 我写了一个宏 我就这样用着它 我第一次使用宏时,它就工作了 但第二次,它失败了: 我不知道为什么会这样。我希望第二个调用将以与第一个调用相同的方式工作,但在验证步骤中似乎存在错误。事实上,如果我删除

  • 调用方式 SOFARPC 在 Bolt 协议下提供了多种调用方式满足不同的场景。 同步 在同步的调用方式下,客户端发起调用后会等待服务端返回结果再进行后续的操作。这是 SOFARPC 的默认调用方式,无需进行任何设置即可。 异步 异步调用的方式下,客户端发起调用后不会等到服务端的结果,继续执行后面的业务逻辑。服务端返回的结果会被 SOFARPC 缓存,当客户端需要结果的时候,再主动调用 API 获

  • 问题内容: Swift协议可以通过向函数和计算属性添加扩展来为其提供默认实现。我已经做了很多次。据我了解, 默认实现仅用作“后备” :当类型符合协议但不提供其自己的实现时,将 执行默认 实现。 至少这就是我阅读《 Swift编程语言》 指南的方式: 如果符合类型提供了自己的所需方法或属性的实现,则将使用该实现而不是扩展提供的实现。 现在,我遇到了这样的情况:我的实现某种协议的自定义类型 确实 为特

  • 详细内容请看这里

  • 问题内容: 假设我有以下协议: 而且我有以下结构: 如您所见,我必须“遵循”结构A和结构B中的Identifiable协议。但是想象一下,如果我还有N个需要符合该协议的结构……我不想“复制/粘贴” ‘一致性(变量ID:整数,变量名称:字符串) 所以我创建了一个 协议扩展 : 现在,通过此扩展,我可以创建符合Identifiable协议的结构,而不必同时实现这两个属性: 现在的问题是我不能为id属性

  • 问题内容: 考虑以下游乐场: 我不知道为什么然后返回-它们应该返回,因为应该动态调度(如协议中声明的那样)。 如果我更改为以下形式: 然后所有三个呼叫将按预期返回。 我觉得这是Swift编译器中的错误,我在Xcode 7.3.1和8.0-beta3中进行了检查,这两种行为都可以重现。 这实际上是预期的行为吗? 问题答案: 您这里涉及到一些规则。 有时使用静态调度(在这种情况下,我们必须查看var