使用return
可以退出当前函数的范围,但是也可以退出调用内部函数的外部函数的范围吗?
func innerFunction() {
guard 1 == 2 else {
// exit scope of innerFunction and outerFunction
}
}
func outerFunction() {
innerFunction()
print("should be unreachable")
}
可能有一种方法使用我们可以检查的内部函数的返回值:
func innerFunction() -> Bool {
guard 1 == 2 else {
return false
}
return true
}
func outerFunction() {
guard innerFunction() else {
return
}
print("should be unreachable")
}
这种方法的问题在于,如果函数变得更复杂并且必须反复使用它们,它会很快混乱你的代码。
考虑将此方法应用于XCTest
。它看起来像这样:
func testFoobar() {
guard let unwrappedObject = helperFunction() else {
XCTFail("A failure message that can change with each helperFunction call")
return
}
print("should be unreachable when helperFunction already failed")
}
我想要有类似的东西:
func testFoobar() {
let unwrappedObject = helperFunction()
print("should be unreachable when helperFunction already failed")
}
答案 0 :(得分:3)
这基本上是Swift的错误处理方式:
func outer() throws
{
try inner()
print("Unreachable")
}
struct DoNotContinue : Error {}
func inner() throws
{
throw DoNotContinue()
}
do { try outer() }
catch _ { print("Skipped the unreachable") }
当然,请注意,调用者仍然可以控制它:它可以捕获抛出的错误本身,而不仅仅是退出。
这种方法的问题在于它会使你的代码混乱
允许被调用者直接退出调用者是一个更严重的问题,那就是控制流非常很快变得难以理解。想象一下,你有几层这样的。阅读顶级功能,您不再清楚可能会发生什么。您必须自己进入每个被调用者的被调用者,以确保原始代码将继续进行。