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 个实现。我在这里错过了什么?
这是因为根据定义,非抛出函数是抛出函数的子类型
来自 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
中的函数实现为非抛出。
在阅读有关异常的 swift 论坛时,我发现了一个有趣的问题。关于异常的例子之一是这样的:
protocol Base {
func foo() throws -> Int
}
protocol Refined: Base {
func foo() -> Int
}
struct Test: Refined {
func foo() -> Int {
0
}
}
有趣的是,我认为它不会编译是拼写错误,但它确实编译了。我不确定这在幕后是如何工作的。我的意思是当协议采用另一个协议时,它也采用了它的要求。但是在这种情况下,声明相同的方法而不抛出某种方式也满足第一个协议 Base
.
至少我预计 Test
需要 foo
的 2 个实现。我在这里错过了什么?
这是因为根据定义,非抛出函数是抛出函数的子类型
来自 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
中的函数实现为非抛出。