Swift 协议继承同名协议方法

时间:2021-03-12 16:13:22

标签: swift swift-protocols

在阅读有关异常的 swift 论坛时,我发现了一个有趣的问题。关于异常的示例之一是这样的:

<section id="about">
    <div class="container-1">
      <div class="box1"></div>
      <div class="box2">
        <h1>About</h1>
        <p>Text</p>
      </div>
    </div>
</section>

很有趣,我认为它不会编译是错字,但它确实如此。我不确定这在幕后是如何工作的。我的意思是当协议采用另一个协议时,它也采用了它的要求。但在这种情况下,声明相同的方法而不抛出异常也满足第一个协议 protocol Base { func foo() throws -> Int } protocol Refined: Base { func foo() -> Int } struct Test: Refined { func foo() -> Int { 0 } }

至少我预计 Base 需要有 2 个 Test 实现。我在这里错过了什么?

1 个答案:

答案 0 :(得分:7)

这是因为根据定义,非抛出函数是抛出函数的子类型

来自 Swift 编程语言书籍

throws 关键字是函数类型的一部分,非抛出函数是抛出函数的子类型。因此,您可以在与抛出函数相同的位置使用非抛出函数。

但是你不能反过来做,所以下面的代码会产生错误

protocol Base {
    func foo()  -> Int
}

protocol Refined: Base {
    func foo() throws -> Int //error: Cannot override non-throwing method with throwing method
}

另请注意,这不仅适用于协议,如果您从 Refined 中删除 func 声明,您仍然可以将 Test 中的函数实现为非抛出。