【问题标题】:Swift Protocol inheriting Protocol method with same nameSwift Protocol 继承 Protocol 方法同名
【发布时间】:2021-03-12 16:13:22
【问题描述】:

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

protocol Base {
    func foo() throws -> Int
}

protocol Refined: Base {
    func foo() -> Int
}

struct Test: Refined {
    func foo() -> Int {
        0
    }
}

这很有趣,我认为它无法编译是错字,但它确实可以。我不确定这在幕后是如何工作的。我的意思是当协议采用另一个协议时,它也采用它的要求。但在这种情况下,以某种方式声明没有抛出的相同方法也满足第一个协议Base

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

【问题讨论】:

    标签: swift swift-protocols


    【解决方案1】:

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

    来自 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 中的函数实现为非抛出。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-20
      相关资源
      最近更新 更多