什么是永不返回类型?

返回类型为Neverfunc做什么

例如:

func addNums()->从来没有{
//我的代码
}

如果我像这样将返回类型保持为Void,会有什么区别

func addNums()->空虚{
//我的代码
}

假设我希望处理一个fatalError(如dpassage所说);以下代码就足够了:

打印(“这是一个错误”)
回来

苹果的文档说:

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

来源:开发者

关于在Swift?中何时以及如何使用@noreturn属性,这不是一个重复的问题,因为我希望得到更详细的答案,需要以下详细信息:

  1. 关于NeverVoid作为返回类型之间差异的实例

  2. 我们应该采用这些返回类型的条件

  3. 也有可能返回类型为零;我也需要一个功能的比较

答案应该集中在差异上

从不返回类型在Swift 3中引入,以替代@noreturn

参见本建议书中的理由:
SE-0102删除@noreturn属性并引入一个空的Never类型

正如官方文件所解释的那样:

不正常返回的函数的返回类型;带有
没有价值观

在声明闭包时,将Never用作返回类型,
无条件抛出错误、陷阱或错误的函数或方法
否则不终止

来源:https://developer.apple.com/documentation/swift/never

基本说明:

//以下函数是我们将使用的自定义函数
//手动和有目的地触发崩溃。在日志中,
//我们可以具体说明到底出了什么问题:例如,无法铸造某些东西,
//无法调用某些内容或某些值不存在:
func crashApp()->从来没有{
fatalError(“发生了非常非常糟糕的事情!使应用程序崩溃!”)
}

@noreturn相比的使用细节和优势,如Erica Sadun所述:

  • 从不允许函数或方法抛出:例如()抛出->从不。抛出允许使用辅助路径进行错误修正,即使在不希望返回的函数中也是如此
  • 作为第一类类型,从未以@noreturn属性无法实现的方式处理泛型
  • 从不主动阻止函数同时声明返回类型和不返回。这是旧体制下的一个潜在问题

第一个注意事项(关于二次错误修正)可能特别重要从不函数可以有复杂的逻辑和抛出-不一定会崩溃

让我们看看一些有趣的用例以及NeverVoid

从来没有

示例1

func noReturn()->从来没有{
fatalError()//fatalError也从不返回,因此不需要返回`
}
func PickPositiveEnumber(低于限制:Int)->Int{
防护限值>=1其他{
诺雷图恩()
//noReturn后无需退出受保护范围
}
返回兰特(限制)
}

示例2

func foo(){
中止
打印(“不应到达此处”)//此行的警告
}

示例3

func bar()->Int{
如果是真的{
abort()//没有警告,也没有编译器错误,因为abort()终止它。
}否则{
返回1
}
}

abort()定义为:

公共函数中止()->从不

空虚

如果它返回Void,则不可能执行这些示例:

公共函数abortVoid()->空虚{
法塔莱罗()
}
函数条()->Int{
如果是真的{
abortVoid()//错误:预期返回“Int”的函数中缺少返回
}否则{
返回1
}
}

并使用abort()返回Never将其打包:

func bar()->Int{
如果是真的{
abort()//无错误,但编译器发现它从不返回并发出警告:
返回2//将永远不会执行
}否则{
返回1
}
}

我们使用Void告诉编译器有没有返回值。应用程序保持运行

我们使用从不告诉编译器有无法返回调用方站点。应用程序运行循环已终止

发表评论