首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Swift协议继承同名协议方法

Swift协议继承同名协议方法
EN

Stack Overflow用户
提问于 2021-03-12 16:13:22
回答 1查看 126关注 0票数 2

在阅读有关例外的快速论坛时,我发现了一些有趣的问题。其中一个关于例外的例子是这样的:

代码语言:javascript
复制
protocol Base {
    func foo() throws -> Int
}

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

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

有趣的是,我认为这是错误的,它不会编译,但它确实。我不知道这在幕后是如何运作的。我的意思是,当协议采用另一种协议时,它也采用了它的要求。但在这种情况下,声明相同的方法,不抛出,不知何故也满足了第一协议Base

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-12 16:25:54

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

来自斯威夫特编程语言书

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

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

代码语言:javascript
复制
protocol Base {
    func foo()  -> Int
}

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

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

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66603415

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档