以下代码为何起作用?
func square(_ x: Int) -> Int {
fatalError()
}
fatalError()从不返回任何内容(或者返回Never)。为什么类型系统不能在这里捕获一个问题,即函子说它会返回一个Int?
答案 0 :(得分:4)
因为fatalError
返回Never
。根据文档Never
,
不正常返回的函数的返回类型,即没有值的类型。
通过编译器魔术,Swift知道fatalError
“不会正常返回”,即它使应用程序崩溃。这就是为什么它不抱怨square
不返回Int
的原因。
如果函数的路径调用了“不正常返回”的函数,则该路径也不会正常返回。 “不正常返回”表示调用者将无法使用返回值,因此在函数的该路径中强制执行“必须返回值”规则毫无意义。
答案 1 :(得分:1)
请考虑将throw
概念化为具有Never类型。在throw
完全不合逻辑之后,它的工作方式与进一步执行代码(包括可能的回报)的方式相同。
func square(_ x: Int) -> Int {
throw TooManyDotsError()
}
在调用类型为-> Never
的函数时也接受这种行为,可以使throw
和fatalError()
之间具有相同的统一性。
在声明无条件引发错误的闭包,函数或方法(如
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");
}