今天我们来看看一个比较冷门的特性关键字:@noreturn

用法

@noreturn 不是 Swift 的独创,在其他语言中有类似的语法。比如在 C 语言中,就有 NORETURN 的宏。他们表达的功能是一样的:一旦你调了这个函数,它永远不会返回

苹果官方文档对@noreturn关键字只有2段文字介绍,让我们来看看我们翻译组的翻译后的文字:

该特性用于修饰函数或方法声明,表明该函数或方法的对应类型 T 是 @noreturn T。你可以用这个特性修饰函数或方法类型,以此表明函数或方法不会返回到它的调用者。

对于没有用 noreturn 特性标记的函数或方法,你可以将它重写为用该特性标记的。相反,对于已经用 noreturn 特性标记的函数或方法,你不可以将它重写为没使用该特性标记的。当你在一个某个采纳协议的类型中实现协议方法时,该规则同样适用。

在喵神的文章中, 系统方法fatalError用到了@noreturn

@noreturn func fatalError(@autoclosure message: () -> String = default,
file: StaticString = default,
line: UInt = default)

Swift 所有函数和方法都可以调用fatalError, 有了@noreturn的修饰以后,fatalError不关心调用者需要返回什么,因为到了fatalError以后,直接就终止了。

编译器遇到@noreturn的修饰的函数调用时,会做一些检查。写在这些函数调用之后的代码,不会运行到,编译器会给出一个警告:

func test() {
fatalError("test")
var a = 1 // 警告:Will never be executed
a = a + 1
}

test()

stackoverflow 相关问题整理

参考资料

文章目录
  1. 1. 用法
  2. 2. stackoverflow 相关问题整理
    1. 2.1. 参考资料