返回类型为Never
的func
做什么
例如:
func addNums()->;从来没有{
//我的代码
}
如果我像这样将返回类型保持为Void
,会有什么区别
func addNums()->;空虚{
//我的代码
}
假设我希望处理一个fatalError
(如dpassage所说);以下代码就足够了:
打印(“这是一个错误”)
回来
苹果的文档说:
不正常返回的函数的返回类型,即没有值的类型
来源:开发者
关于在Swift?中何时以及如何使用@noreturn属性,这不是一个重复的问题,因为我希望得到更详细的答案,需要以下详细信息:
-
关于
Never
和Void
作为返回类型之间差异的实例 -
我们应该采用这些返回类型的条件
-
也有可能返回类型为零;我也需要一个功能的比较
答案应该集中在差异上
从不
返回类型在Swift 3中引入,以替代@noreturn
键
参见本建议书中的理由:
SE-0102删除@noreturn属性并引入一个空的Never类型
正如官方文件所解释的那样:
不正常返回的函数的返回类型;带有
没有价值观在声明闭包时,将Never用作返回类型,
无条件抛出错误、陷阱或错误的函数或方法
否则不终止来源:https://developer.apple.com/documentation/swift/never
基本说明:
//以下函数是我们将使用的自定义函数
//手动和有目的地触发崩溃。在日志中,
//我们可以具体说明到底出了什么问题:例如,无法铸造某些东西,
//无法调用某些内容或某些值不存在:
func crashApp()->;从来没有{
fatalError(“发生了非常非常糟糕的事情!使应用程序崩溃!”)
}
与@noreturn
相比的使用细节和优势,如Erica Sadun所述:
- 从不允许函数或方法抛出:例如()抛出->从不。抛出允许使用辅助路径进行错误修正,即使在不希望返回的函数中也是如此
- 作为第一类类型,从未以@noreturn属性无法实现的方式处理泛型
- 从不主动阻止函数同时声明返回类型和不返回。这是旧体制下的一个潜在问题
第一个注意事项(关于二次错误修正)可能特别重要从不函数可以有复杂的逻辑和抛出-不一定会崩溃
让我们看看一些有趣的用例以及Never
和Void
从来没有
示例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
告诉编译器有没有返回值。应用程序保持运行
我们使用从不
告诉编译器有无法返回调用方站点。应用程序运行循环已终止