繁体   English   中英

Swift 协议继承 同名协议方法

[英]Swift Protocol inheriting Protocol method with same name

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

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

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

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

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

至少我预计Test需要有foo的 2 个实现。 我在这里想念什么?

这是因为根据定义,非投掷 function 是投掷 function 的子类型

来自 Swift 编程语言书

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

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

protocol Base {
    func foo()  -> Int
}

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM