为什么Swift的类型检查系统允许返回类型的函数不返回任何内容?

问题描述

以下代码为何起作用?

func square(_ x: Int) -> Int {
  fatalError()
}

fatalError()从不返回任何内容(或者返回Never)。为什么类型系统不能在这里捕获一个问题,即函子说它会返回一个Int?

解决方法

因为fatalError返回Never。根据文档Never

不正常返回的函数的返回类型,即没有值的类型。

通过编译器魔术,Swift知道fatalError“不会正常返回”,即它使应用程序崩溃。这就是为什么它不抱怨square不返回Int的原因。

如果函数的路径调用了“不正常返回”的函数,则该路径也不会正常返回。 “不正常返回”表示调用者将无法使用返回值,因此在函数的该路径中强制执行“必须返回值”规则毫无意义。

,

请考虑将throw概念化为具有Never类型。在throw完全不合逻辑之后,它的工作方式与进一步执行代码(包括可能的回报)的方式相同。

func square(_ x: Int) -> Int {
    throw TooManyDotsError()
}

在调用类型为-> Never的函数时也接受这种行为,可以使throwfatalError()之间具有相同的统一性。

在声明无条件引发错误的闭包,函数或方法(如throw声明那样),陷阱或其他情况不会终止时,将Never用作返回类型。

方法的返回类型表示如果,该方法必须返回给定类型的值。与throw一样,调用“从不”方法,将阻止在给定分支上返回

要显示它的用处,请比较类型系统中未内置此语言的语言,例如C#:

int F() {
    // guaranteed to throw,but not known to type system
    AlwaysThrow();
    // dummy throw to appease type system
    throw Exception("Not reachable");
}

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...